【问题标题】:Passing array arguments to Perl subroutine将数组参数传递给 Perl 子例程
【发布时间】:2021-03-09 19:25:48
【问题描述】:

我是 perl 编程的新手,我正在尝试使用几个子例程构建一个脚本。首先,我试图运行一个简短的模拟脚本来计算子例程的行为,但我无法理解输入。

这是我的代码:

sub prueba{
  my (@array1, @array2)=@_;
  if (scalar(@array1)<scalar(@array2)) {
    print @array1,"\n";
  } elsif (scalar(@array1)>scalar(@array2)){
    print @array2,"\n";
  }
};

my @primero=(1,5,9);
my @segundo=(1,7,8,9,6,5,6,9);

prueba(@primero,@segundo);

我正在传递两个数组,我希望子例程根据这些数组检索答案,但是当我运行它时,我没有得到任何输出,甚至没有警告错误消息......我已经尝试使用对数组的引用,但仍然无法正常工作:

sub prueba{
  my (@array1, @array2)=@_;
  if (scalar(@array1)<scalar(@array2)) {
    print @array1,"\n";
  } elsif (scalar(@array1)>scalar(@array2)){
    print @array2,"\n";
  }
};

my @primero=(1,5,9);
my @segundo=(1,7,8,9,6,5,6,9);

prueba(\@primero,\@segundo);

【问题讨论】:

    标签: arrays perl subroutine


    【解决方案1】:

    您不能将数组传递给 subs(它们也不能返回它们)。你只能传递一些标量。您正在做的相当于以下内容:

    prueba(1,5,9,1,7,8,9,6,5,6,9);
    

    所有参数都以@array1 结尾。我们所做的是传递对数组的引用。

    prueba(\@primero,\@segundo);
    

    但这也需要更改潜艇。如果不进行更改,所有参数仍以@array1 结尾。请参阅perlreftut 了解如何使用参考。你可以使用

    sub prueba{
      my ($array1, $array2)=@_;
      if (scalar(@$array1)<scalar(@$array2)) {
        print "@$array1\n";
      } elsif (scalar(@$array1)>scalar(@$array2)){
        print "@$array2\n";
      }
    }
    

    或者只是

    sub prueba {
      my ($array1, $array2) = @_;
      if    (@$array1 < @$array2) { say "@$array1"; }
      elsif (@$array1 > @$array2) { say "@$array2"; }
    }
    

    &lt;&gt; 需要一个数字,因此它们已经强加了标量上下文。还不如使用say,尽管这需要use feature qw( say );(或类似use 5.014; 的东西也能做到这一点)。

    【讨论】:

    • 我看到你没有接受这个答案。这个答案有问题吗?
    【解决方案2】:

    您可以使用prototypes 使其看起来就像您正在传递多个数组,并让 perl 自动将它们转换为引用:

    sub prueba :prototype(\@\@) {
        my ($array1, $array2) = @_;
        if (@$array1 < @$array2) {
            print @$array1,"\n";
        } elsif (@$array1 > @$array2){
            print @$array2,"\n";
        }
    }
    
    my @primero=(1,5,9);
    my @segundo=(1,7,8,9,6,5,6,9);
    prueba(@primero, @segundo);
    

    但请仔细阅读文档以了解可以在不强制执行原型的情况下调用子例程的情况。

    【讨论】:

      【解决方案3】:

      谢谢大家,我刚刚弄清楚我想要什么。我发现我实际上可以将数组传递给 perl,但是也许我没有正确解释 mysfel。问题是在子例程中按如下方式加载数组。

      my @primero=@{$_[0]};
      my @segundo=@{$_[1]};
      
      

      这意味着我们正在使用参考。在运行函数时,我们必须在每个输入之前写上\:

      prueba(\@primero,\@segundo);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-05
        • 1970-01-01
        • 2013-12-24
        • 2012-05-30
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-04-20
        相关资源
        最近更新 更多