Есть ли простой синтаксис для объявления нескольких ключей с одним значением в Perl? - PullRequest
9 голосов
/ 15 августа 2011

Есть ли простой способ объявить хеш с несколькими ключами, которые все указывают на одно и то же значение в 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 ]

20 голосов
/ 15 августа 2011

Вы можете написать это:

my %hash;
$hash{$_} = $valA for qw(a b c);
$hash{$_} = $valB for qw(d e f);
12 голосов
/ 15 августа 2011

Нет, для этого нет простого синтаксиса. (На самом деле, => задокументировано как псевдоним для ,, единственным формальным эффектом которого является то, что он допускает использование голого слова слева от него даже в строгом режиме).

Лучшее, что вы можете сделать, не определяя свои собственные сабвуферы, это что-то вроде

@hash{qw(a b c)} = ($valA) x 3 ;
@hash(qw(d e f)} = ($valB) x 3 ;
10 голосов
/ 15 августа 2011

Мне нравится использовать хеш-фрагмент с одной стороны и оператор репликации списка с другой.Я использую скалярное значение массива ключей, чтобы выяснить, сколько значений нужно скопировать:

 @hash{ @keys } = ($value) x @keys;
6 голосов
/ 15 августа 2011

Нет встроенного синтаксиса, но вы всегда можете написать свой собственный:

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 's *Функция 1005 *, которая позволяет загружать несколько клавиш с одинаковым расположением памяти.

4 голосов
/ 15 августа 2011

Вы можете использовать назначение фрагмента хеша:

my $hash = {};

@$hash{a,b,c} = ($valA) x 3;
@$hash{d,e,f} = ($valB) x 3;
2 голосов
/ 15 августа 2011

Назначение также может быть выполнено с помощью операторов, таких как map. Здесь карта раскроется в два списка.

my $hash = {
    ( map { $_ => $valA } ('a' .. 'c') ),
    ( map { $_ => $valB } ('d' .. 'f') ),
};
1 голос
/ 15 августа 2011

Да, как указал Хеннинг Махолм, прямого ярлыка нет, поскольку => является псевдонимом для ,. Самая близкая вещь к ярлыку, о котором я могу думать, является:

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

foreach('d','e','f')
{
  $hash->{$_}=$valB;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...