помочь извлечь как содержимое файла, так и значения из одного и того же имени файла, используя perl - PullRequest
0 голосов
/ 10 декабря 2010

Извините, если это многословно, но у меня есть Perl-скрипт, который частично работает. У меня есть регулярное выражение, которое извлекает либо foo|bar и префикс для данной строки. Но проблема в том, что мои строки также являются ИМЕНАМИ ФАЙЛОВ, которые я также хочу открыть и получить их содержимое, например locale_col.dat.2010120813.png (см. Ожидаемый результат ниже).

Вывод теперь выглядит так:

Content:/home/myhome/col/.my_file_del.mail@locale.foo.org
Key1:foo:Key2:col
Content:/home/myhome/col/.my_file_del.dp1.bar.net
Key1:bar:Key2:col
Content:/home/myhome/jab/.my_file_del.mail@locale.foo.org
Key1:foo:Key2:jab
Content:/home/myhome/jab/.my_file_del.dp1.bar.net
Key1:bar:Key2:jab

Мне нужна помощь в настройке, чтобы за один проход я мог прочитать список строк (имена файлов из FileList.txt), извлечь определенные значения из пути имени файла (используя регулярное выражение) и открыть имя файла для его содержимого. Я надеюсь, что это имеет смысл, или я собираюсь разбить это на 2 сценария Perl? Спасибо за ваш вклад.

Код (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;

Содержимое файла FileList.txt:

/home/myname/col/.my_file_del.mail@locale.foo.org
/home/myname/col/.my_file_del.dp1.bar.net
/home/myname/jab/.my_file_del.mail@locale.foo.org
/home/myname/jab/.my_file_del.dp1.bar.net

Пример содержимого одного из перечисленных файлов: (для извлечения которого мне нужна помощь здесь)

$ cat .my_file_del.mail@locale.foo.org 
locale_col.dat.2010120813.png

Ожидаемый результат:

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

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Вот способ сделать это:

#!/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;
3 голосов
/ 10 декабря 2010

Если у вас есть имена файлов, почему бы не открыть их?

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...