我有一个关于在另一个数组中保存数组的perl查询。之前询问了一个相关的查询(How do I add an array ref to the middle of an existing array in Perl?),但我找不到我的回答,所以我在这里发帖。
我有10个文本文件,每个文件大约有100行文本。我想选择包含“重要”一词的所有行。执行此操作的脚本如下。我在数组中保存包含单词“important”的所有行。所以,从每个文本文件中,我得到一个数组。我想将所有这些数组保存在另一个数组中吗?
my @list_of_files = ("input1.txt", "input2.txt","input3.txt"); my $list_of_files = @list_of_files;
for ($file=0, $file<$list_of_files; $files++){
open INPUT_FILE, "$list_of_files[$file]" or die "can't open $file : $!";
my @input = <INPUT_FILE>;
my $size = @input;
for ($num=0; $num<$size; $num++){
if ($input[$num] =~ m/important/) {
push (@sub_array, $output);
}
}
close INPUT_FILE;
push (@main_array, \@sub_array);
}
@sub_array的元素每次都会改变,所以,我如何保留所有sub_arrays的元素?我希望最终输出为@main_array,其中包含3个元素,每个元素都是一个元素数组(包含单词“important”的行)
任何帮助都非常感谢TIA
答案 0 :(得分:5)
我会对bvr略有不同。但他的观点仍然存在。
# use qw() to define line with less punctuation
my @list_of_files = qw(input1.txt input2.txt input3.txt);
my @lines_in_file;
foreach my $file (@list_of_files) {
open(my $in, '<', $file) or die "can't open $file : $!";
# declare an array, not a scalar
my @lines;
# idiomatic use of while(<>) puts each record into $_
while (<$in>) {
# /../ works on $_ by default.
# Postfix condition is more readable
push @lines, $_ if /important/;
}
# Take reference to array and push it onto main array
push @lines_in_file, \@lines;
}
答案 1 :(得分:4)
我会像这样解决你的问题:
my @list_of_files = ("input1.txt", "input2.txt", "input3.txt");
my @lines_in_file = (); # target array
for my $file (@list_of_files) {
open(my $in,'<',$file) or die "can't open $file : $!";
my $lines = []; # scalar containing arrayref for important lines
while(my $input = <$in>) {
if($input =~ /important/) {
push @$lines, $input; # push into arrayref
}
}
close $in;
push @lines_in_file, $lines; # push arrayref into main array
}
很少有事情需要注意:
[]
在每次迭代中构造新的arrayref。如果您在每个循环中重用@sub_array
并参考它,那么最终会有许多对同一事物的引用答案 2 :(得分:3)
如果您要偶尔在Perl中编写一些内容,您将必须了解引用的工作原理以及如何构建复杂的数据结构。
作为Perl新手,我建议您访问perldoc.perl.org,manuals section,并完成前三节课程。它只需要你大约一个半小时,你就会知道如何解决你的问题以及其他类似问题。
tutorials非常有用 - 简短而实用。您将学习如何传递数据结构并对它们进行迭代等等。
要进行测试,请考虑使用Data::Dumper和print Dumper($var)
轻松查看复杂的数据结构。