Perl子例程数组和标量变量参数

时间:2011-06-09 14:20:47

标签: perl

我如何将标量变量和数组变量传递给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) = @_;
 }

3 个答案:

答案 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;
}