是否有简单的语法用于在 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::Utilhv_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 中声明具有一个值的多个键?的主要内容,如果未能解决你的问题,请参考以下文章

数字IC设计脚本编程系列——Perl基本概念

在 Perl 中测试两个哈希键是不是具有相同的结构

3-Perl 基础语法

是否有与 Perl 的 WWW::Mechanize 等效的 PHP?

Perl 基础语法

Swift 元组(Tuple)