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

Я хочу прочитать несколько файлов из каталога и сохранить каждое значение в уникальной переменной, чтобы потом распечатать его с описательным заголовком. Имена файлов имеют общий префикс, но являются уникальными.

Я знаю, как открыть один файл, но есть ли эффективный способ открыть много файлов? или у меня есть открытые уникальные файловые дескрипторы для каждого? спасибо.

Имена файлов имеют общий префикс, например (abc _ *):

abc_foo_dir
abc_bar.dat1.20101208
abc_bar.dat2.20101209

Пример открытия первого файла:

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

Ответы [ 3 ]

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

Вы говорите «сохранить каждое значение в уникальной переменной», но на самом деле это задача для хеш-таблицы.

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;
}

Вы можете перебрать все ключи позже с keys %file_contents, но есливы не знакомы с тем, как работать с хэшами, я призываю вас прочитать perldoc perldata и perldoc perlsyn .

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

Есть взлом ARGV / @ARGV.ARGV - это специальный файловый дескриптор, который будет читать все файлы, названные в (также специальной) переменной @ARGV.Обычно @ARGV содержит аргументы командной строки, с которыми была вызвана ваша Perl-программа, но вы можете изменить ее.

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

Я не гуру Perl, но я попробую что-то простое,

Почему вы временно не объединяете все файлы в один файл, а затем читаете его?

AFAIK, невозможно прочитать все файлы с одного дескриптора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...