如何在perl中仅打印数组的偶数行?

时间:2014-04-04 00:55:02

标签: arrays perl scripting

我是Perl的新手,我正在尝试编写一个只打印数组偶数行的脚本。我已经尝试了多种不同的查找大小的方法作为我的while循环的条件,但是我总是在没有程序终止的情况下得到第一行的无限循环。正在输入的数组是文本文件,输入格式为“program.pl< foo.txt”。我是否出现了逻辑或语法错误?

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

4 个答案:

答案 0 :(得分:4)

不要用

来解决您的问题
program.pl < foo.txt

相反,只需通过&#39; foo.txt&#39;作为参数:

program.pl foo.txt

在您的脚本中,依赖于<>的默认读取和行号变量$.

use strict;
use warnings;

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

答案 1 :(得分:2)

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

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)

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

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

答案 3 :(得分:0)

我不知道您对$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;
}

当然,将整个文件存储在一个数组中是不必要的,而且大多数情况下你应该只是循环它。就像Miller中显示his answer一样,这可能是我建议的解决方案。使用像JS节目这样的for循环是控制循环的绝佳方法。