如何在另一个数组中存储变量数组?

时间:2011-04-07 09:18:22

标签: perl

我有一个关于在另一个数组中保存数组的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

3 个答案:

答案 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
}

很少有事情需要注意:

  • perl for can遍历数组,没有C风格的麻烦
  • 最好逐行处理文件,而不是将整个内容读入内存,尤其是基于行的处理
  • []在每次迭代中构造新的arrayref。如果您在每个循环中重用@sub_array并参考它,那么最终会有许多对同一事物的引用

答案 2 :(得分:3)

如果您要偶尔在Perl中编写一些内容,您将必须了解引用的工作原理以及如何构建复杂的数据结构。

作为Perl新手,我建议您访问perldoc.perl.orgmanuals section,并完成前三节课程。它只需要你大约一个半小时,你就会知道如何解决你的问题以及其他类似问题。

tutorials非常有用 - 简短而实用。您将学习如何传递数据结构并对它们进行迭代等等。

要进行测试,请考虑使用Data::Dumperprint Dumper($var)轻松查看复杂的数据结构。