为什么我的Perl在最后一个循环?

时间:2010-10-23 16:44:22

标签: arrays perl subroutine

我有这个程序没有按预期工作。帮助我。

我想打印一行标题。

如果输入为4,我希望输出1|2|3|4

它不起作用,如果我硬编码$count值它部分工作但最后一个数字丢失。

sub printC {
        my $count = @_;
        # count = 4  # works partially only prints 1|2|3
        for(my $i=1;$i<$count;$i++) {
                print "$i|";
        }
        print $i;
}
$count  = 2;
&printC($count);
print "\n";

4 个答案:

答案 0 :(得分:11)

问题在于:

my $count = @_;

分配发生在标量上下文中,它将数组@_中的元素数量分配给$count,您的情况为1,就像您一样正在将1参数传递给函数。

要解决此问题,您可以执行以下操作:

my ($count) = @_; 

my $count = $_[0];

这是另一个问题:

for(my $i=1.....
    ^^

使用my您已将$i 本地发送到for的正文,并且 >它。因此,print之外的最终for不会打印任何内容。要解决此问题,请在循环外部声明$i

sub printC {
        my ($count) = @_;
        my $i;
        ....

始终要写点

use strict;

位于程序的顶部,可以捕获这些错误。

执行你的功能所做的 perl方式

print join('|',1..$count);

答案 1 :(得分:5)

真正的Perl黑客可能会写这样的东西:

sub printC {
  my $count = shift;
  print join "|", (1 .. $count);
}

一旦你理解了它是如何工作的,你会发现你已经学到了更多关于Perl的知识。 : - )

答案 2 :(得分:1)

一旦离开$i循环,

for因为声明的位置而不存在。

你可以做到

sub printC {
    my ($count) = @_;
    my $i;
    for ($i = 1; $i < $count; $i++) {
        print "$i|";
    }
    print $i;
}

更简单:

sub printC {
    my ($count) = @_;
    print join("|", 1 .. $count) . "\n";
}

答案 3 :(得分:0)

“更多Perlish”的另一点是不使用C风格的for循环。几乎从不需要在Perl中使用C风格的for

而不是

for(my $i=1;$i<$count;$i++) { ... }

使用

for my $i (1 .. $count) { ... }

它们几乎等价,除了后一版本更容易阅读并且更能抵抗逐个错误。 (您的代码仅打印1|2|3而不是1|2|3|4的原因是因为您的C风格for中的测试正在检查$i<$count何时应该$i<=$count - 这是一个非常常见的错误,C风格的for循环for (list)完全避免。)

另外,请勿使用&为您的子通话添加前缀。这是Perl 4的延续,Perl 5中不再需要它,并且有可能你不知道并且可能不想要的副作用。只需使用printC($count)代替&printC($count)

但是,是的,在这种特殊情况下,无论如何join可能比for更好。