当我在我编写的代码中遇到意外输出时,我试图解决Schwartz的“学习Perl”练习。我想知道我做错了什么。
Qn:实现一个与unix实用程序类似的简单tac。
我的解决方案:
#!/usr/bin/perl
use strict;
use warnings;
my @array;
while (<>) {
push @array, $_;
}
foreach ($#array..0) {
print $array[$_];
}
使用以下内容实施:$ ./tac list
其中列表包含:
$ cat list
An apple
Blue boys
Coy cows
Dreary ducks!
没有输出。
$ ./tac list
$
答案 0 :(得分:4)
您的问题是foreach
循环计数器。你不能那样倒退。
你可以这样做:
while (@array) {
print pop @array;
}
或只是:
print pop @array while (@array);
while (@array)
将评估标量上下文中的@array
,这意味着将测试数组的大小。当大小达到零时,循环将终止。
由于这是perl,当然有一百万种方法可以做到这一点。另一个是:
print for reverse @array
...或者您可以使用unshift
向后读取数组:
#!/usr/bin/perl
use strict;
use warnings;
my @array;
while (<>) {
unshift @array, $_;
}
print for @array;
......或者你甚至可以这样做:
#!/usr/bin/perl
use strict;
use warnings;
print reverse <>;
享受学习Perl!
答案 1 :(得分:2)
范围表示法不会倒数:
$ perl -e 'foreach my $i (10..0) { print "$i\n"; }'
$
您可以使用:
#!/usr/bin/perl
use strict;
use warnings;
my @array = <>;
foreach (0..$#array)
{
print $array[$#array - $_];
}
答案 2 :(得分:1)
您无法在foreach
循环中倒计时。您可以使用reverse
来完成相同的任务
my @array = <>;
foreach (reverse 0..$#array)
{
print $array[$_];
}