【问题标题】:What does '@_' do in Perl?'@_' 在 Perl 中有什么作用?
【发布时间】:2009-01-19 08:17:15
【问题描述】:

我浏览了一些我在 Perl 类中编写的代码,我注意到了这一点。

my ($string) = @_;
my @stringarray = split(//, $string);

我想知道两件事: 变量在括号中的第一行,这是您在声明多个变量时所做的事情,如果我删除它们,它仍然可以正常工作吗?

第二个问题是@_ 是做什么的?

【问题讨论】:

    标签: perl variables


    【解决方案1】:

    @_ 变量是一个数组,其中包含传递给子例程的所有参数。

    $string 变量周围的括号是绝对必要的。它们指定您正在从数组中分配变量。没有它们,@_ 数组在标量上下文中分配给$string,这意味着$string 将等于传递给子例程的参数数量。例如:

    sub foo {
      my $bar = @_;
      print $bar;
    }
    
    foo('bar');
    

    这里的输出是 1——在这种情况下绝对不是你所期望的。

    或者,您可以不使用@_ 数组而是使用shift 函数来分配$string 变量:

    sub foo {
      my $bar = shift;
      print $bar;
    }
    

    使用一种方法而不是另一种方法是一种品味问题。如果您有兴趣,我问了这个问题which you can check out

    【讨论】:

      【解决方案2】:

      当您在 Perl 中遇到特殊(或标点符号)变量时,请查看 the perlvar documentation。它列出了所有这些,给你一个 English 等价物,并告诉你它的作用。

      【讨论】:

        【解决方案3】:

        Perl 有两种不同的上下文,标量上下文和列表上下文。数组'@_',如果在标量上下文中使用,则返回数组的大小。

        鉴于这两个例子,第一个给出@_数组的大小,另一个给出第一个元素。

        my  $string   = @_ ;
        my ($string)  = @_ ;
        

        Perl 具有三个“默认”变量$_@_,具体取决于您询问的对象%_。如果您不给它们一个变量来处理,许多操作将使用这些变量。唯一的例外是目前没有默认使用%_的操作。

        例如,我们有pushpopshiftunshift,它们都将接受一个数组作为第一个参数。 如果你不给他们一个参数,他们将使用“默认”变量。所以'shift;'和'shift @_;'是一样的

        子例程的设计方式,您无法正式告诉编译器您想要哪些变量中的哪些值。好吧,只使用“默认”数组变量“@_”来保存参数是有意义的。

        所以这三个子程序(几乎)是相同的。

        sub myjoin{
          my ( $stringl, $stringr ) = @_;
          return "$stringl$stringr";
        }
        
        sub myjoin{
          my $stringl = shift;
          my $stringr = shift;
          return "$stringl$stringr";
        }
        
        sub myjoin{
          my $stringl = shift @_;
          my $stringr = shift @_;
          return "$stringl$stringr";
        }
        

        我认为第一个比其他两个稍快,因为您没有修改 @_ 变量。

        【讨论】:

        • 良好的反应。但是,我认为 Perl 中从未使用过 %_ 。 (我的意思是,它从来没有被假设过,它也不是任何其他类型的特殊变量。用户当然可以使用它,但他们甚至不会通过键入来保存任何击键,例如,“keys”而不是“keys %_ "。)
        • 我认为我从来没有遇到过任何默认使用 %_ 的内置 Perl 功能,但它仍被视为默认变量之一。或者至少我想我记得在某个地方读过。
        • perlvar 中没有任何关于 %_ 的字样。在我多年的 perl 专业实践中,我没有在任何地方看到它。
        【解决方案4】:

        变量@_ 是一个数组(因此有@ 前缀),其中包含当前函数的所有参数。

        【讨论】:

          猜你喜欢
          • 2010-09-22
          • 2010-09-14
          • 2012-04-18
          • 1970-01-01
          • 2011-06-22
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多