我如何将标量变量和数组变量传递给Perl中的子程序?
my $currVal = 1;
my $currValTwo = 1;
my @currArray = ('one','two','three');
my @currArrayTwo =('one','two','three');
&mysub($currVal, $currValTwo,\@currArray, \@currArrayTwo);
sub mysub() {
# That doesn't work for the array as I only get the first element of the array
my($inVal, $inValTwo, @inArray, @inArrayTwo) = @_;
}
答案 0 :(得分:15)
您需要将它们作为引用获取,因为您已经将它们作为引用传递(通过使用\
运算符):
my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;
然后将引用用作数组:
@{$inArray}
答案 1 :(得分:6)
您将参数作为引用传递,因此您需要取消引用它们以使用这些值。要注意是否要更改原始数组。
sub mysub {
my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;
@{$inArrayTwo} = ('five','six','seven');
}
这会更改原始@currArrayTwo
,这可能不是您想要的。
sub mysub {
my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;
my @ATwo = @{$inArrayTwo};
@ATwo = ('five','six','seven');
}
这只会复制值并使原始数组保持原样。
此外,从perldoc perlsub开始,您不需要子名称前面的&符号:
如果使用& 表单,参数列表是可选的, 如果省略,则不设置@_数组 对于子程序:@_数组at 通话的时间是可见的 而是子程序。这是个 新用户的效率机制 不妨回避。
您的子声明后不需要空的parens。这些用于设置原型,这是你不需要做的事情,除非你真的想要。
答案 2 :(得分:0)
因此,例如:这是一个用于在数组中搜索内容的using语句:
use List::Util qw(first);
这是子声明:
sub GetIndex($$$);
这是对sub的调用(最后一个参数是:如果找不到则返回默认索引值)
$searchedIndex = GetIndex(\@theArr, "valuesearched", 1);
这是例程:
sub GetIndex($$$)
{
my $inArray=shift;
my @theArray= @{$inArray};
my $searchedTag= shift;
my $defaultVal= shift;
my $retVal = first { $theArray[$_] eq $searchedTag} 0 .. $#theArray;
if ((! defined $retVal)|| ($retVal<0)||($retVal>@theArray))
{
$retVal = $defaultVal;
}
return $retVal;
}