实现一个简单的tac程序

时间:2014-05-24 16:40:13

标签: perl

当我在我编写的代码中遇到意外输出时,我试图解决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
$

3 个答案:

答案 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[$_];
}