2010-12-10 74 views
0

Désolé, si cela à verbeux, mais j'ai un script Perl qui fonctionne en partie. J'ai une expression régulière qui extrait foo|bar et un préfixe sur une chaîne donnée. Mais le problème est que mes chaînes sont aussi des noms de fichiers que je veux aussi ouvrir et récupérer son contenu comme locale_col.dat.2010120813.png (voir Sortie attendue ci-dessous).aider à extraire les deux contenus d'un fichier et les valeurs du même nom de fichier en utilisant perl

La sortie ressemble maintenant à ceci:

Content:/home/myhome/col/[email protected] 
Key1:foo:Key2:col 
Content:/home/myhome/col/.my_file_del.dp1.bar.net 
Key1:bar:Key2:col 
Content:/home/myhome/jab/[email protected] 
Key1:foo:Key2:jab 
Content:/home/myhome/jab/.my_file_del.dp1.bar.net 
Key1:bar:Key2:jab 

je besoin d'aide pour peaufiner cela pour que dans un seul passage, je peux lire la liste des chaînes (noms de fichiers de filelist.txt), extraire des valeurs particulières du fichier nommez le chemin (en utilisant regex) et ouvrez le nom du fichier pour son contenu. J'espère que cela a du sens ou est-ce que je cherche à briser cela en 2 scripts Perl? Merci pour votre contribution.

Code (WIP):

open FILE, "< /home/myname/FileList.txt"; 
while (<FILE>) { 
my $line = $_; 
    chomp($line); 
     print "Content:$_"; #This is just printing the filenames. 
       #I want to get the contents of those file names instead. Stuck here. 
     if ($line =~ m/home\/myname\/(\w{3}).*[.](\w+)[.].*/){ 
     print "Key1:$2:Key2:$1\n"; 
     } 
} 
close FILE; 

Contenu de filelist.txt:

/home/myname/col/[email protected] 
/home/myname/col/.my_file_del.dp1.bar.net 
/home/myname/jab/[email protected] 
/home/myname/jab/.my_file_del.dp1.bar.net 

contenu Exemple de l'un des fichiers répertoriés: (que je besoin d'aide ici pour extraire)

$ cat [email protected] 
locale_col.dat.2010120813.png 

Sortie attendue:

Content:locale_col.dat.2010120813.png 
Key1:foo:Key2:col 
... 
.. 

Répondre

3

Voici une façon de le faire:

#!/usr/bin/perl 
# ALWAYS these 2 lines !!! 
use strict; 
use warnings; 

my $file = '/home/myname/FileList.txt'; 
# use 3 args open and test openning for failure 
open my $FILE, '<', $file or die "unable to open '$file' for reading: $!"; 
while (my $line = <$FILE>) { 
    chomp($line); 
    print "Content:$line\n"; #This is just printing the filenames. 
    #I want to get the contents of those file names instead. Stuck here. 
    if ($line =~ m#home/myname/(\w{3}).*[.](\w+)[.].*#) { 
     open my $file2, '<', $line or die "unable to open '$file' for reading: $!"; 
     while(my line2 = <$file2>) { 
      print $line2; 
     } 
     close $file2; 
     print "Key1:$2:Key2:$1\n"; 
    } 
} 
close $FILE; 
+0

+1 pour 'TOUJOURS ces 2 lignes' –

+0

@goreSplatter: Merci vous, c'est vraiment une bonne pratique !! –

+0

@bourbaki - merci. J'essaie ceci, bien que j'empêche d'utiliser la poignée de fichier "FILE". est-ce que mon $ FILE doit être déclaré? – cjd143SD

3

Si vous possédez les noms de fichiers, pourquoi ne pas les ouvrir?

use strict; 
use warnings; 
use 5.010; 
use autodie; 

open my $fh, '<', '/home/myname/FileList.txt'; 
while (my $line = <$fh>) { 
    chomp $line; 
    say "Key1:$2:Key2:$1" if m!home/myname/(\w{3})[^.]*[.](\w+)[.].*!; 
    next unless -e $line; #We skip to the next line unless the file exists 
    open my $inner_fh, '<', $file; 
    while (<$inner_fh>) { 
     say; 
    } 
} 
+0

merci, on dirait que je avais juste besoin d'ouvrir un autre fh dans mon boucle while. D'accord, je n'ai jamais utilisé 'dire'. aura besoin de regarder ça. – cjd143SD

+0

dire est juste imprimer avec un \ n automatique à la fin. La paresse supplémentaire, c'est tout. Aussi, bien que j'utilise autodie pour obtenir le même effet ici, vous devriez vraiment envisager de vérifier la valeur de retour de tous vos appels système (comme open), comme dans la réponse de bourbaki, ainsi que d'utiliser la forme ouverte de trois arguments (pour plus d'informations à ce sujet, voir perlopentut dans perldoc, et ceci: http://perltraining.com.au/tips/2005-11-17.html) – Hugmeir