【问题标题】:Perl subroutine array and scalar variable parametersPerl 子程序数组和标量变量参数
【发布时间】:2011-06-09 14:20:47
【问题描述】:

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

【问题讨论】:

  • 哪个数组,你用的是两个?
  • 两者都发生了,但 Blagovest 的回答修复了它!
  • 我整天都在寻找这个问题。谢谢你问这个!!!

标签: perl


【解决方案1】:

您需要获取它们作为引用,因为您已经将它们作为引用传递(通过使用 \ 运算符):

my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;

然后将引用用作数组:

@{$inArray}

【讨论】:

    【解决方案2】:

    您将参数作为引用传递,因此您需要取消引用它们才能使用这些值。请注意是否要更改原始数组。

    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

    如果使用 & 调用子例程 形式,参数列表是可选的, 如果省略,则不设置 @_ 数组 对于子例程:@_ 数组位于 通话时间可见 子程序代替。这是个 新用户的效率机制 不妨避免。

    子声明后不需要空括号。这些用于设置原型,除非您真的想这样做,否则您不需要这样做。

    【讨论】:

    • 知道如何通过引用传递 XML::Writer 吗?如何在子例程中取消引用它?
    • 我不熟悉那个模块,但我想说任何对象都会以标量值传递。
    【解决方案3】:

    因此,例如:这是一个在数组中搜索某些内容的 using 语句:

    use List::Util qw(first);
    

    这是子声明:

    sub GetIndex($$$);
    

    这是对子的调用(最后一个参数是:如果没有找到则返回的默认索引值)

    $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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2015-09-24
      • 2015-03-28
      • 2014-12-12
      • 1970-01-01
      • 2013-08-12
      • 2017-05-28
      • 2021-08-12
      • 2011-07-13
      相关资源
      最近更新 更多