【发布时间】:2009-01-19 08:17:15
【问题描述】:
我浏览了一些我在 Perl 类中编写的代码,我注意到了这一点。
my ($string) = @_;
my @stringarray = split(//, $string);
我想知道两件事: 变量在括号中的第一行,这是您在声明多个变量时所做的事情,如果我删除它们,它仍然可以正常工作吗?
第二个问题是@_ 是做什么的?
【问题讨论】:
我浏览了一些我在 Perl 类中编写的代码,我注意到了这一点。
my ($string) = @_;
my @stringarray = split(//, $string);
我想知道两件事: 变量在括号中的第一行,这是您在声明多个变量时所做的事情,如果我删除它们,它仍然可以正常工作吗?
第二个问题是@_ 是做什么的?
【问题讨论】:
@_ 变量是一个数组,其中包含传递给子例程的所有参数。
$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。
【讨论】:
当您在 Perl 中遇到特殊(或标点符号)变量时,请查看 the perlvar documentation。它列出了所有这些,给你一个 English 等价物,并告诉你它的作用。
【讨论】:
Perl 有两种不同的上下文,标量上下文和列表上下文。数组'@_',如果在标量上下文中使用,则返回数组的大小。
鉴于这两个例子,第一个给出@_数组的大小,另一个给出第一个元素。
my $string = @_ ;
my ($string) = @_ ;
Perl 具有三个“默认”变量$_、@_,具体取决于您询问的对象%_。如果您不给它们一个变量来处理,许多操作将使用这些变量。唯一的例外是目前没有默认使用%_的操作。
例如,我们有push、pop、shift 和unshift,它们都将接受一个数组作为第一个参数。
如果你不给他们一个参数,他们将使用“默认”变量。所以'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";
}
我认为第一个比其他两个稍快,因为您没有修改 @_ 变量。
【讨论】:
变量@_ 是一个数组(因此有@ 前缀),其中包含当前函数的所有参数。
【讨论】: