我正在阅读Llama(Learning Perl)书,并正在进行练习。对于这个练习:
编写一个程序,该程序在单独的行上读取字符串列表,直到输入结束,并以相反的顺序打印出列表。 [ 。 ]
好吧,我已经想出了一个更简单的方法(我记得你可以在数组上使用reverse
...到目前为止Perl真是太棒了...但是我想知道为什么这个不行
#!/usr/bin/perl
use 5.010;
chomp(@strings = <STDIN>);
foreach (@strings){
push @revstrings, $_;
}
while($i++ <= scalar @revstrings){
say pop @revstrings;
}
它是这样的:
$ ./first
的一个
2个
3
[^ d]
3个
2个
$
如果我将while循环中的<=
更改为<
,则输出相同。
答案 0 :(得分:15)
你永远不会过中...每次通过最后一次迭代,你都会得到:
$i++
表示$i
将增加1; pop @revstrings
表示scalar @revstrings
将减少一个。当$i++
超过原始@revstrings
长度的一半时,他们会在中间相遇。
实际上,$i++
是不必要的,因为当数组为空时scalar @revstrings
将为零,所以你只需要:
while(scalar @revstrings){
say pop @revstrings;
}
答案 1 :(得分:0)
编辑:简短回答是“因为您的循环条件错误。”更冗长的“标量@revstrings在每次迭代时被评估”。
while (<STDIN>) {
push @lines, $_
}
while(@lines){
print pop @lines;
}
少输入
@lines = <STDIN>;
while(@lines){
print pop @lines;
}
较小的打字
@lines = <STDIN>;
print reverse @lines;
较小的打字
print reverse <>;
但最好的解决方案是
exec("tac");