web-dev-qa-db-fra.com

Lire un fichier dans un tableau à l'aide de Perl

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?

14
alex

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>
33
Ed Guiness

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.

5
Geo

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";  
}
5
Eugene Yarmash

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

4
Lumi