Чтение нескольких файлов? - PullRequest
0 голосов
/ 03 января 2011

Как я могу прочитать несколько файлов в Perl и сохранить их в хэш?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 03 января 2011
my %data;
my @FILES = @ARGV;
# or maybe   @FILES = glob("some/directory/*.ext");

Поскольку это Perl, есть много способов сделать это.

# 1. Open and load each file    
foreach my $file (@FILES) {
    local $/ = undef;
    open my $fh, '<', $file;
    $data{$file} = <$fh>;
}

# 1b. Using  map
%data = map { 
   local $/=undef;
   open my $fh, '<', $file;
   my $data = <$fh>;
   $_ => $data
} @FILES;

# 2. Leverage your operating system
foreach my $file (@FILES) {
    $data{$file} = qx(/bin/cat "$file");
}

# 3. Use a module
use File::Slurp;
foreach my $file (@FILES) {
    $data{$file} = File::Slurp::slurp($file);
}

# 3b, using  map
use File::Slurp;
%data = map { $_ => File::Slurp::slurp($_) } @FILES;
4 голосов
/ 03 января 2011

См. Эту запись perlfaq: Как я могу прочитать весь файл сразу?

Хеш может быть создан следующим образом:

my %hash = (
    filename => $file_content,
    # ...
);
1 голос
/ 03 января 2011
my %data;
foreach my $fn (@ARGV) {
    open (my $IN, $fn) or die "couldn't open $fn: $!";
    $data{$fn} = join "", <$IN>;
    close $fn;
}

foreach my $key (keys %data) {
    print "File $key:\n$data{$key}\n\n\n";
}

Код перебирает список имен файлов, в данном случае передаваемых как аргументы командной строки в @ARGV. Для каждого имени файла он открывает дескриптор файла и читает его в контексте массива, который загружает каждую строку файла как элемент массива. В этом случае мы читаем анонимный массив, который передается в объединение. Join склеивает элементы массива вместе, в данном случае с пустой строкой в ​​качестве разделителя. Результат, одна строка со всем содержимым файла, затем сохраняется в хэше с именем файла в качестве ключа. Второй цикл просто печатает результаты.

Обратите внимание, что для больших файлов это хороший способ быстро исчерпать себя. Подумайте о способах обработки ваших данных в потоковом режиме.

0 голосов
/ 03 января 2011

Предполагая, что все файлы находятся в @ARGV, например, если они являются аргументами командной строки, вы можете перебирать их все так:

@array = ();
while (<>) {
    push @array, $_;
    # or any other manipulation on the lines
    # for instance extracting a key and value from
    # the line and putting them into a hash
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...