我正在尝试自学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)