我浏览了一些我在Perl类中编写的代码,并注意到了这一点.
my ($string) = @_; my @stringarray = split(//, $string);
我想知道两件事:变量在括号中的第一行,这是你在声明多个变量时所做的事情,如果我删除了它,它仍然能正常工作吗?
第二个问题是@_做什么?
该@_
变量是一个包含传递给子例程的所有参数的数组.
$string
变量周围的括号是绝对必要的.它们指定您从数组中分配变量.没有它们,@_
数组将被分配到$string
标量上下文中,这意味着$string
它将等于传递给子例程的参数数量.例如:
sub foo { my $bar = @_; print $bar; } foo('bar');
这里的输出是1 - 绝对不是你在这种情况下所期望的.
或者,您可以在$string
不使用@_
数组的情况下分配变量,而是使用shift
函数:
sub foo { my $bar = shift; print $bar; }
使用一种方法而不是另一种方法是一种品味问题.我问了这个问题,你可以查看一下你是否感兴趣.
当您在Perl中遇到特殊(或标点符号)变量时,请查看perlvar文档.它列出了所有,给你一个英语等价物,并告诉你它做了什么.
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"; }
我认为第一个比其他两个略快,因为你没有修改@_
变量.
变量@_
是一个数组(因此是@
前缀),它保存当前函数的所有参数.