【问题标题】:How can I print only the even numbered lines of an array in perl?如何在 perl 中只打印数组的偶数行?
【发布时间】:2014-05-16 02:35:46
【问题描述】:

我是 Perl 的新手,正在尝试编写一个只打印数组的偶数行的脚本。我尝试了多种不同的方法来查找大小以用作我的 while 循环的条件,但我总是最终得到第一行的无限循环而没有程序终止。输入的数组是一个文本文件,以“program.pl

@input = <STDIN>;
$i = $1;
$size = $#input + $1;
while ($size >= $i) {
        print "$input[$i]";
        $i = ($i + $2);
}

【问题讨论】:

  • $1 是存储从正则表达式捕获的字符串的变量,并且您的代码中没有正则表达式,因此很可能 $1 未定义。与$2 相同。

标签: arrays perl scripting


【解决方案1】:

假设您已经有一个包含所有输入的数组,在您的示例 @input 中,您可以使用 Array Slice 将所有偶数索引条目放入另一个数组,如下所示:

my @input_even_entries_only = @input[grep { $_ % 2 == 0 } 0..$#input];

方括号内的表达式计算为0$#input 之间的所有偶数。

然后您可以使用常规的for/foreach 循环遍历生成的数组:

for my $val (@input_even_entries_only) {
    print "$val";
}

【讨论】:

    【解决方案2】:

    我不知道你在用 $1$2 变量做什么。你以为它们只是数字吗?

    当你使用一个没有赋值的变量时,它是未定义的,在数值上下文中使用时会被转换为0。如果你不使用use warnings,这是静默完成的,会比较混乱。

    除此之外,您的代码不会太远。它应该是这样的:

    use strict;
    use warnings;
    
    my @input = <>;   # <> is more flexible and does the same thing
    my $i = 1;
    while ($i <= $#input) {
        print $input[$i];
        $i += 2;
    }
    

    当然,不必将整个文件存储在数组中,而且大多数情况下您应该只循环遍历它。就像Millerhis answer 中显示的那样,这可能是我建议的解决方案。使用 for 循环(如 JS 显示)是控制循环的好方法。

    【讨论】:

      【解决方案3】:

      如果您尝试打印索引为偶数的数组的行,请尝试以下操作:

      use strict;
      use warnings;
      
      my @input = <DATA>;
      for(my $i=0; $i<=$#input; $i+=2) {
          print $input[$i];
      }
      
      __DATA__
      1
      2
      3
      4
      5
      6
      

      输出:

      1
      3
      5
      

      【讨论】:

        【解决方案4】:

        不要把你的问题称为

        program.pl < foo.txt
        

        相反,只需将 'foo.txt' 作为参数传递:

        program.pl foo.txt
        

        在您的脚本中,依赖&lt;&gt; 的默认读取和行号变量$.

        use strict;
        use warnings;
        
        while (<>) {
            next if $. % 2;  # Skip odd numbers.
            print;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          • 1970-01-01
          • 1970-01-01
          • 2011-03-02
          • 1970-01-01
          相关资源
          最近更新 更多