Perl Hash Slice,Replication x Operator和sub params

use*_*757 2 perl hash slice replicate

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

sub test{
    my %hash;
    @hash{@_} = (undef) x @_;
}
Run Code Online (Sandbox Code Playgroud)

示例调用sub:

test('one', 'two', 'three');
Run Code Online (Sandbox Code Playgroud)

这条线是什么引发了我:

@hash{@_} = (undef) x @_;
Run Code Online (Sandbox Code Playgroud)

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

%哈希:

'one'=> undef,'two'=> undef,'three'=> undef

x运算符的rvalue应该是一个数字; 如何将@_解释为子参数数组的长度?我希望你至少要做到这一点:

@hash{@_} = (undef) x scalar @_;
Run Code Online (Sandbox Code Playgroud)

FMc*_*FMc 10

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

重复运算符.x运营商的重复操作.在列表上下文中,如果运算符的左侧参数括在括号中,它将重复列表中的项:

my @x = ('foo') x 3;  # ('foo', 'foo', 'foo')
Run Code Online (Sandbox Code Playgroud)

标量上下文中的数组.在标量上下文中使用数组时,它返回其大小.该x运营商强加给它的右边的参数标量上下文.

my @y = (7,8,9);
my $n = 10 * @y; # $n is 30
Run Code Online (Sandbox Code Playgroud)

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

# 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 @_;
Run Code Online (Sandbox Code Playgroud)

做同样事情的不那么模糊的方法:

@hash{@_} = ();
$hash{$_} = undef for @_;
Run Code Online (Sandbox Code Playgroud)

  • +1为@hash {@_} =();`,这是惯用的方式. (4认同)