是否有简单的语法用于在 perl 中声明具有一个值的多个键?
Posted
技术标签:
【中文标题】是否有简单的语法用于在 perl 中声明具有一个值的多个键?【英文标题】:Is there simple syntax for declaring multiple keys with one value in perl? 【发布时间】:2011-10-27 09:33:30 【问题描述】:有没有一种简单的方法来声明一个包含多个键的哈希,这些键在 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
【问题讨论】:
【参考方案1】:你可以这样写:
my %hash;
$hash$_ = $valA for qw(a b c);
$hash$_ = $valB for qw(d e f);
【讨论】:
我希望我能把它放在答案而不是评论中。 =P【参考方案2】:不,没有简单的语法。 (实际上,=>
被记录为 ,
的别名,其唯一的正式效果是即使在严格模式下也允许其左侧出现裸词。
在不定义自己的 subs 的情况下你能做的最好的事情可能是这样的
@hashqw(a b c) = ($valA) x 3 ;
@hash(qw(d e f) = ($valB) x 3 ;
【讨论】:
【参考方案3】:我喜欢在一侧使用哈希切片,在另一侧使用列表复制运算符。我使用键数组的标量值来计算要复制多少个值:
@hash @keys = ($value) x @keys;
【讨论】:
我喜欢这个解决方案,即使它比 $hash$_ = $value for @keys 稍慢;【参考方案4】:没有内置语法,但您可以随时编写自己的语法:
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
函数,它允许您加载具有完全相同内存位置的多个键。
【讨论】:
【参考方案5】:可以使用散列切片赋值:
my $hash = ;
@$hasha,b,c = ($valA) x 3;
@$hashd,e,f = ($valB) x 3;
【讨论】:
【参考方案6】:也可以使用语句完成赋值,例如使用map
。在这里,map 将展开为两个列表。
my $hash =
( map $_ => $valA ('a' .. 'c') ),
( map $_ => $valB ('d' .. 'f') ),
;
【讨论】:
【参考方案7】:是的,正如 Henning Makholm 指出的那样,没有直接的捷径,因为=>
是,
的别名。我能想到的最接近捷径的是:
foreach('a','b','c')
$hash->$_=$valA;
foreach('d','e','f')
$hash->$_=$valB;
【讨论】:
$hash->$_ = $valA for ('a' .. 'c');
更漂亮。以上是关于是否有简单的语法用于在 perl 中声明具有一个值的多个键?的主要内容,如果未能解决你的问题,请参考以下文章