【问题标题】:Pass array and scalar to a Perl subroutine [duplicate]将数组和标量传递给 Perl 子例程
【发布时间】:2012-05-30 12:53:04
【问题描述】:

可能重复: How do pass one array and one string as arguments to a function?

我有一个函数或子例程,它将第一个参数作为数组接收,将第二个参数作为标量接收。例如,

sub calc {
    my @array = $_[0];
    my $scalar = $_[1];
    print @array, $scalar;
}

问题是该函数使数组等于传入数组的第一个值,而标量成为传入数组的第二个值。当我希望第一个数组成为整个数组时,我不需要制作数组的深层副本。例如,

my @array = ('51', 'M');
my $scalar = 21;

calc(@array, $scalar)

当我想要51 M 21 时将打印51 M

【问题讨论】:

    标签: perl reference subroutine


    【解决方案1】:

    要么使用对数组的引用作为第一个参数,要么反转参数,使标量在前,数组在后:

    sub reversed_args
    {
       my($scalar, @array) = @_;
       # ...
       print @array, $scalar, "\n";
    }
    
    my @array = ('51', 'M');
    my $scalar = 21;
    
    reversed_args($scalar, @array);
    

    不要尝试Perlprototypes(两篇文章,一篇关于 StackOverflow,一篇关于 PerlMonks)。

    【讨论】:

    • 不尝试使用原型的要点是什么?
    • 最短的形式是“不要使用 Perl 原型”;下一个最短的形式是“Perl 函数原型不能像您期望的那样工作,专家建议您不要尝试使用它们”。长篇大论的版本是这样的:“Perl 原型是一个失败的实验,它在使用时会导致更多的悲伤和惊愕,而不是它们提供的有用帮助,从而导致难以诊断问题——这条道路上充满了绝望和疯狂”。跨度>
    【解决方案2】:

    Perl 子例程中的参数列表只是一个平面数组。如果要传递不同的数组,则必须将其作为数组引用传递。

    【讨论】:

      【解决方案3】:

      您需要将其作为参考传递:

      calc(\@array, $scalar)

      然后访问它为:my @array = @{$_[0]};

      【讨论】:

      • 请注意,我的答案的第二部分将复制数组。您也可以将其作为参考,并在整个函数中适当地访问它
      • 这实际上不起作用,我试过了。你测试过吗?
      • 对不起,我猜@是在 [0] 之前应用的。我在 $_[0] 周围放了一个带大括号的固定版本。
      • 优雅的回答——非常感谢。
      【解决方案4】:

      您可以将数组的引用传递给您的函数:

      calc(\@array, $scalar);
      

      当您需要在子例程中访问 @array 的元素时,您可以这样做:

      my $array = $_[0];
      
      # access first element of array
      print $array->[0];
      

      编辑:由于这是对原始数组的引用,因此在子例程中所做的任何更改都将反映在原始数组中。

      【讨论】:

      • 酷,我知道这是语法问题,谢谢!
      • @Dan,这不是语法错误。问题是您不明白子调用的参数列表是作为一个表达式计算的,而不是一系列逗号分隔的表达式。
      • 好吧,我想了这么多,所以我会说我不同意。我只是不知道如何告诉 perl 我正在通过一个数组。
      • @Dan 如果您对我的回答感到满意,您介意接受吗?
      • 您应该向 OP 提及传递引用将允许 sub 更改原始数组。
      【解决方案5】:

      将您的数组作为数组引用传递给 calc 子例程:

      calc(\@array, $scalar);
      

      然后在你的 calc 子例程中,你像这样初始化你的输入参数:

      sub calc {
        my($array_ref, $scalar) = @_;
      
        foreach my $item (@$array_ref) {
          # process each item in the array ref
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-12
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        相关资源
        最近更新 更多