繁体   English   中英

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

[英]How can I print only the even numbered lines of an array in perl?

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

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

不要打扰您

program.pl < foo.txt

相反,只需传递“ foo.txt”作为参数:

program.pl foo.txt

在脚本中,依靠从<>和行号变量$.默认读取$.

use strict;
use warnings;

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

假设您已经拥有一个包含所有输入的数组,在示例@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";
}

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

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

我不知道你在用$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他的答案中所显示的那样,这可能是我建议的解决方案。 使用像JS show这样的for循环是控制循环的绝佳方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM