读多个文件?

时间:2011-01-03 19:50:08

标签: perl

如何在perl中读取多个文件并将它们存储在哈希中?

感谢。

4 个答案:

答案 0 :(得分:13)

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;

答案 1 :(得分:4)

请参阅此perlfaq条目:How can I read in an entire file all at once?

可以像这样创建哈希:

my %hash = (
    filename => $file_content,
    # ...
);

答案 2 :(得分:1)

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的匿名数组。连接将数组的元素粘合在一起,在这种情况下将空字符串作为分隔符。结果,一个包含整个文件内容的字符串,然后以文件名作为键存储在哈希中。第二个循环只打印结果。

请注意,对于大文件,这是快速运行自己内存的好方法。考虑以流模式处理数据的方法。

答案 3 :(得分:0)

假设所有文件都在@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
}