好的,我了解 perl 散列切片和 the "x" operator在 Perl 中,但有人可以从 here 中解释以下代码示例吗? (稍微简化)?
sub test{
my %hash;
@hash{@_} = (undef) x @_;
}
子调用示例:
test('one', 'two', 'three');
这一行让我感到震惊:
@hash{@_} = (undef) x @_;
它正在创建一个散列,其中键是 sub 的参数并初始化为 undef,所以:
%哈希值:
'一个' => undef, '二' => 未定义, '三' => 未定义
x运算符的右值应该是一个数字; @_ 是如何解释为子参数数组的长度的?我希望您至少必须这样做:
@hash{@_} = (undef) x scalar @_;
最佳答案
要理解这段代码,您需要了解三件事:
重复运算符。 x
运算符是 repetition operator .在列表上下文中,如果运算符的左侧参数括在括号中,它将重复列表中的项目:
my @x = ('foo') x 3; # ('foo', 'foo', 'foo')
标量上下文中的数组。当在标量上下文中使用数组时,它会返回其大小。 x
运算符在其右侧参数上施加标量上下文。
my @y = (7,8,9);
my $n = 10 * @y; # $n is 30
哈希切片。 hash slice语法提供了一种同时访问多个散列项的方法。哈希切片可以检索哈希值,也可以将其分配给。在手头的例子中,我们分配给一个散列切片。
# Right side creates a list of repeated undef values -- the size of @_.
# We assign that list to a set of hash keys -- also provided by @_.
@hash{@_} = (undef) x @_;
做同样事情的不那么晦涩的方法:
@hash{@_} = ();
$hash{$_} = undef for @_;
关于Perl 哈希切片、复制 x 运算符和子参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969697/