我是Perl的新手,我正在尝试编写一个只打印数组偶数行的脚本。我已经尝试了多种不同的查找大小的方法作为我的while循环的条件,但是我总是在没有程序终止的情况下得到第一行的无限循环。正在输入的数组是文本文件,输入格式为“program.pl< foo.txt”。我是否出现了逻辑或语法错误?
@input = <STDIN>;
$i = $1;
$size = $#input + $1;
while ($size >= $i) {
print "$input[$i]";
$i = ($i + $2);
}
答案 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
循环是控制循环的绝佳方法。