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