2009-05-18 9 views
0

J'ai écrit un script qui lit chaque fichier dans un répertoire, fait quelque chose et affiche les résultats de chaque fichier d'entrée dans deux fichiers différents, par ex. "outfile1.txt" et "outfile2.txt". Je veux être en mesure de lier mes fichiers résultants à ceux d'origine, alors comment puis-je ajouter le nom de fichier d'entrée (infile.txt) aux noms de fichiers résultants, pour obtenir quelque chose comme ceci:Perl: ajout du nom de fichier d'entrée à la sortie du nom de fichier

infile1_outfile1.txt, infile1_outfile2.txt

infile2_outfile1.txt, infile2_outfile2.txt

infile3_outfile1.txt, infile3_outfile2.txt ...?

Merci pour toute aide!

Répondre

6

Utilisez une substitution pour enlever le « txt » du nom du fichier d'entrée. Utilisez concaténation de chaîne pour construire vos noms de fichiers de sortie:

my $infile = 'infile1.txt'; 

my $prefix = $infile; 
$prefix =~ s/\.txt//; # remove the '.txt', notice the '\' before the dot 

# concatenate the prefix and the output filenames 
my $outfile1 = $prefix."_outfile1.txt"; 
my $outfile2 = $prefix."_outfile2.txt"; 
0

concaténation de chaîne simple devrait fonctionner ici, ou regarder CPAN pour un module approprié

0

Si je vous comprends bien, vous cherchez quelque chose comme ça?

use strict; 
use warnings; 

my $file_pattern = "whatever.you.look.for"; 
my $file_extension = "\.txt"; 

opendir(DIR, '/my/directory/') or die("Couldn't open dir"); 
while(my $name_in = readdir(DIR)) { 
    next unless($name_in =~ /$file_pattern/); 

    my ($name_base) = ($name_in =~ /(^.*?)$file_pattern/); 
    my $name_out1 = $name_base . "outfile1.txt"; 
    my $name_out2 = $name_base . "outfile2.txt"; 
    open(IN, "<", $name_in) or die("Couldn't open $name_in for reading"); 
    open(OUT1, ">", $name_out1) or die("Couldn't open $name_out1 for writing"); 
    open(OUT2, ">", $name_out2) or die("Couldn't open $name_out2 for writing"); 

    while(<IN>) { 
     # do whatever needs to be done 
    } 

    close(IN); 
    close(OUT2); 
    close(OUT1); 
} 
closedir(DIR); 

Édition: Stripping d'extension implémenté, poignée de fichier d'entrée fermée et testée maintenant.

4
use File::Basename; 
$base = basename("infile.txt", ".txt"); 
print $base."_outfile1.txt"; 
Questions connexes