Przeszukiwanie tablicy w Perlu


(macia60@op.pl) #1

Witam.

Chcę napisać program, który przeszukuje tablicę w Perlu.

Dokładnie chodzi o pobranie ze standardowego wejścia nazwy usera i znalezienia jej w tablicy (lub jeżeli lepiej to w pliku).

Część już napisalem, niestety przystawiło mi z tym przeszukiwaniem.


(Sawyer47) #2

Pokaż jakiś kod do którego można się odnieść. Być może wcale nie chodzi Ci o przeszukiwanie tablicy, tzn. da się całą rzecz zrobić inaczej - szybciej.

Zgodnie z zanim-cokolwiek-napiszesz-przeczytaj-ten-temat-t152275.html - opisuj co chcesz uzyskać a nie jak.


(macia60@op.pl) #3

!/usr/bin/perl

use strict;

use warnings;

open(PLIK, "<>plik.txt");

my @linie = /mail/*>;

my @l = map { substr $_, 10 } @linie;

print PLIK $_, "@.ux.ap.krakow.pl \n" for @l;

my$a = ;

print "$a";

print ("Podaj jakiego maila szukasz \n");

my$odpowiedz = ;

print ("szukasz maila usera: $odpowiedz");

chomp ( $odpowiedz );

if ($a =~ ,..................){

print "mail tego usera $_ \n";

}

else{

print"brak takiego usera \n";

};

close PLIK;

Cel jest taki, żeby skrypt przeszukał plik i jeżeli znajdzie nazwę którą podajemy to ją wypisał.

-- Dodane 14.06.2011 (Wt) 13:53 --

Dodam, że chcę to zrobić za pomocą wyrażenia regularnego ale nie mam pojęcia jak to napisać żeby przeszukało cały plik.


(Sawyer47) #4

Przy zwykłym przeszukiwaniu podciągu w tekście sensowniejszym rozwiązaniem jest raczej funkcja index: http://perldoc.perl.org/functions/index.html

Szczerze nie do końca pojmuję sens powyższego kodu, ale...

Jeśli masz jakiś plik i chcesz sprawdzić czy występuje w nim jakiś podciąg to po prostu wczytuj go linia po linii (podejrzewam, że wyszukiwany podciąg nie ma w sobie znaku nowej linii). Jeśli wczytana linia zawiera ten podciąg to przerywasz. Jeśli plik nie jest duży, a wyszukiwanie będzie wykonywane wielokrotnie być może warto wczytać cały plik do pamięci.


(macia60@op.pl) #5

plik wygląda mniej więcej tak:

user1@.wx.poczta.pl

user2@.wx.poczta.pl

user3@.wx.poczta.pl

user4@.wx.poczta.pl

user5@.wx.poczta.pl

itd.

niestety nie wiem jak powinien wyglądać zapis takiej instrukcji ;/


(Sawyer47) #6

Mogłoby to wyglądać tak:

#!/usr/bin/perl


use strict;

use warnings;


my $szukany = "user3";


open PLIK, '<', 'data.txt' or die "Nie można otworzyć pliku: $!";


while ()	{

	chomp;

	if (index($_, $szukany) > -1) {

		print "Odnaleziono |$_|\n";

		last;

	}

}


close PLIK;

Choć oczywiście może nie o to Ci chodzi. No i tak jak napisałem, jeśli plik będzie często przeszukiwany, a nie jest duży to być może warto go całego wczytać do pamięci. Jeszcze taka dygresja, obecnie w Perlu zaleca się raczej otwieranie plików do skalarów, tak więc:

#!/usr/bin/perl


use strict;

use warnings;


my $szukany = "user3";


open my $plik, '<', 'data.txt' or die "Nie można otworzyć pliku: $!";


while (<$plik>)	{

	chomp;

	if (index($_, $szukany) > -1) {

		print "Odnaleziono |$_|\n";

		last;

	}

}


close $plik;

(macia60@op.pl) #7

Wielkie dzięki.

Miło, że jeszcze jest forum gdzie można znaleźć pomocnych ludzi iWyrozumiałych :slight_smile: