是否有简单的语法来声明perl中有一个值的多个键?

时间:2011-08-15 16:00:39

标签: perl syntax hashtable

是否有一种简单的方法来声明具有多个键的哈希值,这些键都指向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 个答案:

答案 0 :(得分:18)

你可以这样写:

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

答案 1 :(得分:12)

不,没有简单的语法。 (实际上,=>被记录为,的别名,其正式效果是即使在严格模式下它也允许在其左侧使用裸字。)

如果没有定义自己的潜艇,你可以做的最好的事情可能就像是

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

答案 2 :(得分:10)

我喜欢在一侧使用哈希切片而在另一侧使用列表复制运算符。我使用keys数组的标量值来确定要复制的值的数量:

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

答案 3 :(得分: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的{​​{1}}函数,它允许您加载具有完全相同内存位置的多个键。

答案 4 :(得分:4)

您可以使用哈希切片分配:

my $hash = {};

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

答案 5 :(得分:2)

也可以使用语句进行分配,例如使用map。在这里,地图将扩展为两个列表。

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

答案 6 :(得分:1)

是的,正如Henning Makholm指出的那样,没有直接的捷径,因为=>,的别名。我能想到的最接近捷径的是:

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

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