2010-12-09 6 views
-1

Je souhaite lire plusieurs fichiers dans un répertoire et stocker chaque valeur dans une variable unique afin de pouvoir l'imprimer plus tard avec un en-tête descriptif. Les noms de fichiers ont un préfixe commun, mais sont uniques. Je sais comment ouvrir un fichier, mais existe-t-il un moyen efficace d'ouvrir de nombreux fichiers? ou ai-je des poignées de fichier uniques ouvertes pour chacun? Merci.perl - comment lire plusieurs fichiers dans un répertoire et stocker des données dans une variable unique

Les noms de fichiers ont un préfixe commun comme (abc_ *):

abc_foo_dir 
abc_bar.dat1.20101208 
abc_bar.dat2.20101209 

Exemple ouvre premier fichier:

open FILE, "< /home/test/data/abc_foo_dir"; 
while (<FILE>) { 
my $line = $_; 
chomp($line); 
print "$line\n"; 
} 
close FILE; 
+0

Est-ce que ce travail est fait? De plus, vous ne faites rien avec le contenu, juste en l'imprimant à nouveau. – Ether

+0

pas devoirs, je construis ce programme. Je veux éventuellement imprimer les données dans un fichier qui sera utilisé pour un autre programme. Je regarde fondamentalement un moyen facile de lire plus d'un fichier. – jdamae

Répondre

6

Vous dites "stocker chaque valeur dans une variable unique", mais cela est en fait une tâche pour une table de hachage.

my %file_contents; 
foreach my $filename (qw(...filenames here... or use a glob to fetch them)) 
{ 
    open my $fh, '<', $filename or die "Cannot open $filename: $!"; 
    local $/; # enable slurp mode 

    # read in the entire contents of the file and store in the hash 
    $file_contents{$filename} = <$fh>; 

    # this would close automatically when going out of scope, 
    # but it's nice to be explicit 
    close $fh; 
} 

Vous pouvez parcourir toutes les clés plus tard avec keys %file_contents, mais si vous n'êtes pas familier avec la façon de travailler avec hash, je vous invite à lire perldoc perldata et perldoc perlsyn.

+0

merci! Pouvez-vous me montrer comment imprimer les clés? – jdamae

+0

@ jda6one9 Pour obtenir les clés d'un hachage, utilisez les 'clés'. par exemple. foreach my $ key (clés de tri% my_hash) {...} Vous pouvez, bien sûr, laisser de côté le bit 'sort', si l'ordre n'a pas d'importance, ou vous pouvez utiliser un mode de tri plus sophistiqué. – canavanin

-1

Je ne suis pas un gourou Perl, mais je vais essayer quelque chose de simple,

Pourquoi vous ne concaténer temporairement tous les fichiers dans un seul fichier, puis le lire. AFAIK, il n'y a aucun moyen de lire tous les fichiers à partir d'un seul descripteur.

0

Il y a le hack ARGV/@ARGV. ARGV est un descripteur de fichier spécial qui lit tous les fichiers nommés dans la variable (également spéciale) @ARGV. Normalement, @ARGV contient les arguments de la ligne de commande auxquels votre programme Perl a été appelé, mais vous êtes autorisé à le modifier.

{ 
    #local @ARGV = ('abc_foo_dir', 'abc_bar.dat1.20101208', ...); 
    local @ARGV = glob("$dir/abc_*"); 

    while (<ARGV>) { 
     print "Read a line from $ARGV: $_"; # $ARGV holds name of current file 
    } 
} 
Questions connexes