2010-01-10 4 views
3

Perl peut-il générer des handles de fichiers par programme?Comment puis-je générer plusieurs handles de fichiers Perl par programme?

Je veux ouvrir dix fichiers simultanément et y écrire en utilisant le handle de fichier qui se compose de (CONST NAME + NUMBER). Par exemple:

print const_name4 "data.."; #Then print the datat to file #4 
+2

n'est-il pas possible de stocker les handles de fichiers dans un tableau? – adamse

+1

Il y a un chapitre entier dans _Intermediate Perl_ à propos de cela. :) –

Répondre

9

Vous pouvez coller des handles de fichiers directement dans un emplacement de tableau non initialisé.

my @handles; 
for my $number (0 .. 9) { 
    open $handles[$number], '>', "data$number"; 
} 

Ne pas oublier que la syntaxe pour l'impression d'une poignée dans un tableau est légèrement différent:

print $handles[3] $data; # syntax error 
print {$handles[3]} $data; # you need braces like this 
3

Ces jours-ci, vous pouvez attribuer handles de fichiers à scalaires (plutôt que d'utiliser des expressions (comme par exemple le fait)), de sorte que vous pouvez simplement créer un tableau et le remplir avec ceux-ci.

my @list_of_file_handles; 
foreach my $filename (1..10) { 
    open my $fh, '>', '/path/to/' . $filename; 
    push $list_of_file_handles, $fh; 
} 

Vous pouvez, bien sûr, utiliser à la place variable variables, mais ils sont une approche méchante et je l'ai jamais vu un temps lors de l'utilisation d'un tableau ou hachage n'a pas été un meilleur pari.

+0

Mais si je veux écrire au cinquième fichier par exemple comment je le fais aussi vous voulez pousser @list_of_file_handles, $ fh; ? merci – dan

+0

print {$ list_of_file_handles [4]} $ data; – Quentin

5

Avec un peu de IO::File et map vous pouvez aussi le faire:

use IO::File; 

my @files = map { IO::File->new("file$_", 'w') } 0..9; 

$files[2]->print("writing to third file (file2)\n"); 
Questions connexes