Perl 为什么pass by ref需要移位而不是@?
我有一个关于在Perl中通过引用传递子例程的问题。对于值,如果我使用@uu传递,它将起作用,但对于仅引用的shift则起作用。不知道为什么。我给出了下面的示例代码: 这项工作:Perl 为什么pass by ref需要移位而不是@?,perl,Perl,我有一个关于在Perl中通过引用传递子例程的问题。对于值,如果我使用@uu传递,它将起作用,但对于仅引用的shift则起作用。不知道为什么。我给出了下面的示例代码: 这项工作: #! /usr/bin/perl use strict; use warnings; my $name = 'John'; PassScalarByRef( \$name ); sub PassScalarByRef{ my $got = shift; print "Hello $$got\n";
#! /usr/bin/perl
use strict;
use warnings;
my $name = 'John';
PassScalarByRef( \$name );
sub PassScalarByRef{
my $got = shift;
print "Hello $$got\n";
}
但不是这个:
#! /usr/bin/perl
use strict;
use warnings;
my $name = 'John';
PassScalarByRef( \$name );
sub PassScalarByRef{
my $got = @_;
print "Hello $$got\n";
}
在第二种情况下,分配给
$got
为@
提供了一个标量上下文,从而使其计算为其大小(元素数)。你可以说:
my ($got) = @_;
…将
@
的第一个元素指定给$got
,如您所料。您正在标量上下文中使用@
数组$got
现在包含传递的参数数。您应该尝试使用my($got)=@,它现在在列表上下文中使用数组,这就是您的意思。使用不同的方法
我的$got=$\u0] 大多数运算符以一致的方式为其操作数提供特定的上下文;例如,
+
给出两个操作数的标量上下文|
给出其左操作数标量上下文,右操作数给出|
本身具有的任何上下文
赋值有点不同,因为有两种类型,列表赋值和标量赋值
标量赋值如下所示:
$scalar = ...
lvaluesub() = ...
(左值子类是perl很少使用的特性;内置的pos
就是一个例子)
只分配了一个值,这些值给出了=
的右操作数标量上下文
列表分配如下所示:
@array = ...
@arraytoslice[...] = ...
%hash = ...
@hashtoslice{...} = ...
( ... ) = ...
甚至
() = ...
所有这些都需要赋值的值列表,因此请给出正确的操作数列表上下文
当你说:
my $got = @_;
这是一个标量赋值,因此@
获取标量上下文,从而使其返回其元素数,而不是第一个值
相反,你可以说:
my ($got) = @_;
有些人会始终如一地这样做,即使对于只有一个操作数的子对象也是如此;其他人会
my $param1 = shift;
my $param2 = shift;
对于具有少量操作数的子对象
对于方法来说,对于其余参数,使用shift键和@u的列表赋值来获取对象/类是很常见的。注意:Perl总是按ref传递。您所做的是为将来遇到这个问题的人传递ref.注释:这个问题与按引用传递或按值传递无关。它与列表分配和标量分配有关,我的文章版本。