[英]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.