我浏览了一些我在Perl课程中编写的代码,并注意到了这一点。
my ($string) = @_;
my @stringarray = split(//, $string);
我想知道两件事: 变量在括号中的第一行,这是在声明多个变量时执行的操作,如果我删除它们,它仍然可以正常工作吗?
第二个问题是@_做什么?
答案 0 :(得分:23)
@_
变量是一个数组,其中包含传递给子例程的所有参数。
$string
变量周围的括号是绝对必要的。它们指定您从数组中分配变量。如果没有它们,@_
数组将在标量上下文中分配给$string
,这意味着$string
将等于传递到子例程的参数数量。例如:
sub foo {
my $bar = @_;
print $bar;
}
foo('bar');
这里的输出是1 - 绝对不是你在这种情况下所期望的。
或者,您可以在不使用$string
数组的情况下分配@_
变量,而是使用shift
函数:
sub foo {
my $bar = shift;
print $bar;
}
使用一种方法而不是另一种方法是一种品味问题。如果你有兴趣,我问了这个问题which you can check out。
答案 1 :(得分:12)
当您在Perl中遇到特殊(或标点符号)变量时,请查看the perlvar documentation。它列出了所有内容,为您提供English等效内容,并告诉您它的作用。
答案 2 :(得分:10)
Perl有两个不同的上下文,标量上下文和列表上下文。如果在标量上下文中使用数组'@_
',则返回数组的大小。
所以给出这两个例子,第一个给出了@_
数组的大小,另一个给你第一个元素。
my $string = @_ ;
my ($string) = @_ ;
Perl有三个“默认”变量$_
,@_
,具体取决于您询问的人%_
。如果您没有为它们提供变量,许多操作将使用这些变量。唯一的例外是当前默认情况下没有使用%_
的操作。
例如,我们有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";
}
我认为第一个比其他两个稍快,因为你没有修改@_
变量。
答案 3 :(得分:6)
变量@_
是一个数组(因此是@
前缀),它保存当前函数的所有参数。