Je lis actuellement un fichier et stocke les données dans un tableau nommé @lines
. Ensuite, je boucle à travers ce tableau en utilisant une boucle for
et à l'intérieur de la boucle je fais correspondre certaines valeurs:
$find = "fever";
if ($_ =~ /$find/) {
print "$_\n";
$number++;
#@lines =
#print ("there are : " . $number);
}
En ce moment, j'utilise un scalaire, $find
, avec une valeur de fever
au lieu d'exécuter les instructions répétitives pour chaque filtre.
Puis-je passer un tableau pour comparaison au lieu d'un mot-clé scalaire?
Si vous lisez un fichier dans une liste, il prendra tout à la fois
@array = <$fh>; # Reads all lines into array
Comparez cela avec la lecture dans un contexte scalaire
$singleLine = <$fh>; # Reads just one line
La lecture du fichier entier à la fois peut être un problème, mais vous avez l'idée.
Ensuite, vous pouvez utiliser grep
pour filtrer votre tableau.
@filteredArray = grep /fever/, @array;
Ensuite, vous pouvez obtenir le nombre de lignes filtrées en utilisant scalar
, ce qui force le contexte scalaire (c'est-à-dire une valeur unique) à l'interprétation du tableau, dans ce cas, renvoyant un nombre.
print scalar @filteredArray;
Mettre tous ensemble...
C:\temp>cat test.pl
use strict; use warnings; # always
my @a=<DATA>; # Read all lines from __DATA__
my @f = grep /fever/, @a; # Get just the fevered lines
print "Filtered lines = ", scalar @f; # Print how many filtered lines we got
__DATA__
abc
fevered
frier
forever
111fever111
abc
C:\temp>test.pl
Filtered lines = 2
C:\temp>
Utilisez Tie :: File . Il charge le fichier dans un tableau, que vous pouvez manipuler à l'aide des opérations de tableau. Lorsque vous détachez le fichier, ses composants seront enregistrés dans le fichier.
Si vous avez Perl 5.10 ou une version ultérieure, vous pouvez utiliser la correspondance intelligente (~~
):
my @patterns = (qr/foo/, qr/bar/);
if ($line ~~ @patterns) {
print "matched\n";
}
Vous pouvez également utiliser le File::Slurp
module, ce qui est pratique.
use strict;
use warnings;
use File::Slurp 'read_file';
my $fname = shift or die 'filename!';
my @lines = grep /fever/, read_file $fname; # grep with regular expression
print @lines;
Si vous débutez avec Perl, jetez un œil aux opérateurs map
et grep
, qui sont pratiques pour le traitement des listes.
Jetez également un œil à l'utilitaire ack
, qui est un excellent remplacement pour find
/grep
. (En fait, c'est une alternative supérieure.)