2

好的,我了解 perl 哈希片和Perl中的“x”运算符,但是有人可以从这里解释以下代码示例(稍微简化)吗?

sub test{
    my %hash;
    @hash{@_} = (undef) x @_;
}

示例调用子:

test('one', 'two', 'three');

这条线是什么让我:

@hash{@_} = (undef) x @_;

它正在创建一个哈希,其中键是 sub 的参数并初始化为 undef,因此:

%哈希:

'一' => undef, '二' => undef, '三' => undef

x 运算符的右值应该是一个数字;@_ 是如何被解释为子参数数组的长度的?我希望你至少必须这样做:

@hash{@_} = (undef) x scalar @_;
4

2 回答 2

10

要弄清楚这段代码,您需要了解三件事:

重复运算符。x运算符是重复运算符。在列表上下文中,如果运算符的左侧参数括在括号中,它将重复列表中的项目:

my @x = ('foo') x 3;  # ('foo', 'foo', 'foo')

标量上下文中的数组。在标量上下文中使用数组时,它会返回其大小。运算符将x标量上下文强加在其右侧参数上。

my @y = (7,8,9);
my $n = 10 * @y; # $n is 30

哈希切片。哈希切片语法提供了一种同时访问多个哈希项的方法。哈希切片可以检索哈希值,也可以分配给它。在手头的情况下,我们正在分配一个哈希片。

# 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 @_;
于 2010-06-03T21:36:11.633 回答
0

在标量上下文中,数组计算其长度。来自perldoc perldata

如果在标量上下文中计算数组,它会返回数组的长度。(请注意,列表不是这样,它返回最后一个值,如 C 逗号运算符,也不是内置函数,它返回他们想要返回的任何内容。)

尽管我目前无法找到有关它的更多信息,但复制运算符似乎在标量上下文中评估其第二个参数,从而导致数组评估为其长度。

于 2010-06-03T21:03:14.197 回答