Perl 哈希切片、复制 x 运算符和子参数

标签 perl hash slice replicate

好的,我了解 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/

相关文章:

perl - 使用 Travis CI(使用 docker)对 Perl 存储库进行本地测试

perl - 在 moose 中定义文件句柄属性

algorithm - 复杂排序选择数据结构的建议

arrays - js函数调用的go函数不能返回数组。 panic : ValueOf: invalid value

javascript - 在 while 循环中增加一个 object.position.set

perl - Bash的“DIE”信号处理程序

java - 将对象添加到 LinkedList java 数组

c++ - 你如何散列一个字符串?我需要以某种方式将随机字符串转换为整数以将它们放入我的哈希表中

C#哈希密码创建盐问题

Python:选择具有更改值的行