繁体   English   中英

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

[英]Why is my Perl loop off by one at the end?

我有这个程序不能按预期工作。 帮我。

我想打印一行标题。

如果输入为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";

问题出在这里:

my $count = @_;

赋值发生在标量上下文中,它将数组@_的元素数分配给$count ,大小写为1 ,因为您将1参数传递给函数。

要解决此问题,您可以:

my ($count) = @_; 

要么

my $count = $_[0];

这是另一个问题:

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

通过使用my ,你做了$i 局部的身体for ,它会无法使用外面 因此,你在for之外的最终print不会印刷任何东西。 要解决此问题,请在循环外部声明$i

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

总是要写点

use strict;

在您的程序的顶部,使您能够捕获此类错误。

执行函数功能的perl方法是:

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

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

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

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

一旦你离开for循环, $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";
}

“更多Perlish”的另一点是不使用C风格for循环。 有几乎从来没有需要使用C风格for Perl编写的。

代替

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 - for (list)完全避免使用C风格for循环,这是一个非常常见的错误。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM