5

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

我想打印一个行标题。

如果输入是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

4 回答 4

11

问题在这里:

my $count = @_;

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

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

my ($count) = @_; 

或者

my $count = $_[0];

这是另一个问题:

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

通过使用my,您已将其$i 本地化,并且在其外部for将不可用。所以你在外面的决赛没有打印任何东西。要解决此问题,请移动循环外的声明:printfor$i

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

始终以写作为重点

use strict;

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

perl执行您的函数的方法是:

print join('|',1..$count);
于 2010-10-23T16:49:04.960 回答
5

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

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

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

于 2010-10-23T16:58:49.037 回答
1

$ifor由于声明的位置,一旦离开循环,它就不存在了。

你可以做

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";
}
于 2010-10-23T16:55:08.020 回答
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

于 2010-10-24T12:19:53.100 回答