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

use*_*167 5 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";
Run Code Online (Sandbox Code Playgroud)

cod*_*ict 11

问题出在这里:

my $count = @_;
Run Code Online (Sandbox Code Playgroud)

分配是发生在一个标量,其在指定数组元素的数量方面@_$count,你的情况是1,当你正在传递1参数的功能.

要解决此问题,您可以:

my ($count) = @_; 
Run Code Online (Sandbox Code Playgroud)

要么

my $count = $_[0];
Run Code Online (Sandbox Code Playgroud)

这是另一个问题:

for(my $i=1.....
    ^^
Run Code Online (Sandbox Code Playgroud)

通过使用my你已经在身体的$i 本地for,它将不会外面.所以你最后的print外面for不打印任何东西.要解决此问题,请$i在循环外部声明:

sub printC {
        my ($count) = @_;
        my $i;
        ....
Run Code Online (Sandbox Code Playgroud)

总是要写点

use strict;
Run Code Online (Sandbox Code Playgroud)

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

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

print join('|',1..$count);
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 5

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

sub printC {
  my $count = shift;
  print join "|", (1 .. $count);
}
Run Code Online (Sandbox Code Playgroud)

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