初学者调用Perl子例程

phi*_*ogg 2 perl

我正在尝试自学Perl,我到处寻找可能是一个非常简单的问题的答案.我已经定义了一个子程序,我调用它来计算单词中的字母数.如果我这样写出来:

 $sentence="This is a short sentence.";

 @words = split(/\s+/, $sentence);

 foreach $element (@words) {
     $lngths .= length($element) . "\n";
 }
 print "$lngths\n";
Run Code Online (Sandbox Code Playgroud)

然后它就像一个魅力.但是,如果我将其包装到子例程中,则拆分不会拆分输入,而是将整个句子计为单个输入.这是我如何定义子程序:

sub countWords {
    @words = split(/\s+/, @_);
    foreach $element(@words) {
        $lngths .= length($element) . "\n";
    }
    return $lngths;
}
Run Code Online (Sandbox Code Playgroud)

从我阅读过的所有页面和我所咨询过的文本中,这应该可行,但事实并非如此.

提前致谢!

Nat*_*man 13

问题是你的使用@_.这是一个数组,但你像标量一样访问它.

@_包含此函数的所有参数.它看起来的方式,你传递一个句子,你想分开它.以下是一些可能的方法:

@words = split(/\s+/, $_[0]);
Run Code Online (Sandbox Code Playgroud)

这意味着"将第一个参数带到函数并将其拆分".

要么:

my $sentence = shift;
@words = split(/\s+/, $sentence);
Run Code Online (Sandbox Code Playgroud)

这几乎是一样的,但使用中间变量来提高可读性.


事实上,你正在做的是:

@words = split(/\s+/, @_);
Run Code Online (Sandbox Code Playgroud)

意思是:

  • 解释@_为标量,表示(1,在这种情况下)中的元素数量@_
  • "1"用空格分割字符串

返回数组:

@words = ("1");
Run Code Online (Sandbox Code Playgroud)