当前位置:  开发笔记 > 编程语言 > 正文

"@_"在Perl中做了什么?

如何解决《"@_"在Perl中做了什么?》经验,为你挑选了4个好方法。

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

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

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

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



1> cowgod..:

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

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

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

foo('bar');

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

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

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

使用一种方法而不是另一种方法是一种品味问题.我问了这个问题,你可以查看一下你是否感兴趣.



2> brian d foy..:

当您在Perl中遇到特殊(或标点符号)变量时,请查看perlvar文档.它列出了所有,给你一个英语等价物,并告诉你它做了什么.



3> Brad Gilbert..:

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

因此,给出这两个示例,第一个给出了@_  数组的大小,另一个给出了第一个元素.

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

Perl有三个'Default'变量$_,@_取决于你问的对象%_.如果您没有为它们提供变量,许多操作将使用这些变量.唯一的例外是目前没有默认使用的操作%_.

例如,我们已经push,pop,shift,和unshift,所有将接受一个数组作为第一个参数.如果你没有给他们一个参数,他们将使用'default'变量.所以' shift;'与' shift @_;' 相同

子程序的设计方式,你无法正式告诉编译器你想在哪些变量中使用哪些值.那么只使用'default'数组变量' @_'来保存参数是有道理的.

所以这三个子程序(几乎)相同.

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

我认为第一个比其他两个略快,因为你没有修改@_变量.



4> 1800 INFORMA..:

变量@_是一个数组(因此是@前缀),它保存当前函数的所有参数.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有