如何在perl中读取多个文件并将它们存储在哈希中?
感谢。
答案 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
}