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