<>
117 |
Operatorul <> permite o cale simplă de citire din mai multe fişiere de intrare. Să ne reamintim că citirea dintr-un fişier se face de exemplu cu instrucţiunea
$line=<MYFILE>;
Dacă programul myprog.pl a fost lansat cu linia de comandă
perl myprog.pl file1 file2 file3
şi acest program conţine într-o buclă instrucţiunea
$line=<>;
de fiecare dată când se ajunge la execuţia acestei instrucţiuni se va citi o linie din file1. La epuizarea liniilor din file1 se continuă cu citirea liniilor din file2, iar apoi din file3. Iată deci ca Perl asigură o interfaţă simplă de a apela mai multe fişiere in secvenţă.
Mai mult, în Perl, operatorul <> de fapt conţine o referinţă ascunsă către array-ul @ARGV. Iată cum funcţionează:
Atunci când interpretorul Perl găseşte operatorul <> pentru prima dată, el deschide fişierul al cărui nume este memorat în $ARGV[0].
După deschiderea fişierului, perl execută următoarea funcţie din bibliotecă: shift(@ARGV); În acest mod funcţia shift înlătură primul element al @ARGV şi mută celelalte elemente o poziţie la stânga. Aceasta înseamnă că elementul x al @ARGV devine elementul x-1.
Operatorul <> citeşte apoi toate liniile fişierului deschis la pasul 1.
Atunci când operatorul <> epuizează un fişier, interpretorul Perl merge din nou la pasul şi repetă ciclul din nou.
Dacă doriţi, puteţi modifica programul dvs pentru a extrage o valoare din linia de comandă şi apoi să modificaţi @ARGV astfel încât operatorul <> să poată lucra corect. Astfel programul anterior se poate modifica şi se obţine programul.
Secvenţă cod |
Comentarii |
$searchword = $ARGV[0]; print ("Word to search for: $searchword\n"); |
Se salvează cuvântul căutat în variabilă $searchword |
shift (@ARGV); |
Se şterge $ARGV[0] din @ARGV astfel încât array-ul conţine acum numai nume de fişiere |
$totalwordcount = $wordcount = 0; |
Se iniţializează contoarele |
$filename = $ARGV[0]; |
Se memorează în $filename numele primului fişier |
while ($line = <>) { |
Bucla while citeşte câte o linie din secvenţa de fişiere memorată în operatorul <> |
chop ($line); |
Se şterge caracterul de sfârşit de linie din $line |
@words = split(/ /, $line); |
Se separă cuvintele din şirul $line şi se memorează separat în array-ul @words |
$w = 1; while ($w <= @words) { if ($words[$w-1] eq $searchword) { $wordcount += 1; } $w++; }
|
Buclă while pentru contorizarea cuvintelor din linia curentă. Variabila $w este index de cuvinte în linie. |
if (eof) { print ("occurrences in file $filename: "); print ("$wordcount\n"); |
Dacă s-a întâlnit sfârşitul fişierului curent (eof) se tipăreşte de câte ori a apărut cuvântul căutat în acest fişier. Aici se vede necesitatea introducerii variabilei $filename |
$totalwordcount += $wordcount; $wordcount = 0; |
Se adună numărul de cuvinte din fişierul tocmai epuizat la totalul general şi se iniţializează din nou contorul de cuvinte pentru fişierul curent. |
$filename = $ARGV[0]; |
După atingerea sfârşitului unui fişier Perl a făcut automat shift(@ARGV) astfel încât numele fişierului curent este din nou în $ARGV[0] şi trebuie memorat. |
} } print ("total number of occurrences: $totalwordcount\n"); |
Sfârşit de bucle şi tipărirea totalului general. |
© Cornel Mironel Niculae, 2003-2004
13-Nov-2009