Un program de căutare cuvânt şi numărare care utilizează operatorul <>

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ă:

  1. 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].

  2. 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.

  3. Operatorul <> citeşte apoi toate liniile fişierului deschis la pasul 1.

  4. 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