在Perl中,是否有一种简单的语法来声明具有一个值的多个键?

10

有没有一种简单的方法在 Perl 中声明一个哈希,其中多个键都指向相同的值?

这里有一个类似于我正在寻找的东西(我不确定这是否有效):

my $hash = {
             a, b, c => $valA,
             d, e, f => $valB
           };

这样的话......

print $hash->{a}; #prints $valA
print $hash->{b}; #prints $valA
print $hash->{c}; #prints $valA
print $hash->{d}; #prints $valB
print $hash->{e}; #prints $valB
print $hash->{f}; #prints $valB
7个回答

23

您可以编写以下代码:

my %hash;
$hash{$_} = $valA for qw(a b c);
$hash{$_} = $valB for qw(d e f);

我希望我把这个放在回答里而不是评论里。=P - TLP

13

没有简单的语法可以实现这个。 (实际上,=>被记录为,的别名,其唯一的正式影响是它允许在严格模式下即使在其左侧没有引号包裹的词组也能通过)。

如果不定义自己的子例程,你最好能做的是像这样:

@hash{qw(a b c)} = ($valA) x 3 ;
@hash(qw(d e f)} = ($valB) x 3 ;

11

我喜欢在一侧使用哈希片段(hash slice),在另一侧使用列表复制运算符。我使用键数组的标量值来确定要复制多少个值:

 @hash{ @keys } = ($value) x @keys;

1
我喜欢这个解决方案,即使它比 $hash{$_} = $value for @keys; 稍微慢一些。 - Robert

6

虽然没有内置的语法,但你总是可以自己编写:

my $value = sub {map {$_ => $_[1]} @{$_[0]}};

my $hash = {
    [qw(a b c)]->$value('valA'),
    [qw(d e f)]->$value('valB'),
};

say join ', ' => map "$_: $$hash{$_}", sort keys %$hash;
# a: valA, b: valA, c: valA, d: valB, e: valB, f: valB

如果你会经常这样做,你可能需要看一下Hash::Util库的hv_store函数,它允许你将多个键加载到完全相同的内存位置中。

4
你可以使用哈希切片赋值:
my $hash = {};

@$hash{a,b,c} = ($valA) x 3;
@$hash{d,e,f} = ($valB) x 3;

2

赋值也可以使用语句完成,例如使用map。在这里,map将扩展为两个列表。

my $hash = {
    ( map { $_ => $valA } ('a' .. 'c') ),
    ( map { $_ => $valB } ('d' .. 'f') ),
};

1

是的,正如Henning Makholm所指出的那样,由于=>,的别名,因此没有直接的快捷方式。我能想到的最接近的快捷方式是:

foreach('a','b','c')
{
  $hash->{$_}=$valA;
}

foreach('d','e','f')
{
  $hash->{$_}=$valB;
}

3
$hash->{$_} = $valA for ('a' .. 'c'); 这行代码更加简洁漂亮。 - TLP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接