как иметь хэш списка в Perl - PullRequest
       11

как иметь хэш списка в Perl

4 голосов
/ 22 сентября 2011

Извините за этот вопрос синтаксиса. Я не могу найти решение. Я хочу иметь массив хэшей в Perl, каждый из которых имеет строку и массив. Я пытаюсь написать следующий код:

use strict;
my @arr = (
       { name => "aaa" , values => ("a1","a2") },
       { name => "bbb" , values => ("b1","b2","b3") }
      );


foreach $a (@arr) {
  my @cur_values = @{$a->{values}};
  print("values of $a->{name} = @cur_values\n");
};

Но это не работает для меня. Я получаю сообщение об ошибке компиляции и предупреждение (используя perl -w)

Нечетное количество элементов в анонимном хеше в строке 2.pl. Невозможно использовать строку ("a1") в качестве ссылки ARRAY, в то время как "строгие ссылки" используются в строке 9.pl.

Ответы [ 3 ]

8 голосов
/ 22 сентября 2011

Я хочу иметь массив хэшей в perl

Вы не можете.Массивы содержат только скаляры в Perl.Тем не менее, {} создаст хеш-выражение, которое является скаляром и в порядке.

Но это:

{ name => "aaa" , values => ("a1","a2") }

означает то же самое, что:

{ name => "aaa" , values => "a1", "a2" },

Вам нужен arrayref (который является скаляром), а не список для значения.

{ name => "aaa" , values => ["a1","a2"] }
6 голосов
/ 22 сентября 2011

Попробуйте следующее:

use strict;
my @arr = (
       { name => "aaa" , values => ["a1","a2"] },
       { name => "bbb" , values => ["b1","b2","b3"] }
      );


foreach $a (@arr) {
  my @cur_values = @{$a->{values}};
  print("values of $a->{name}: ");
    foreach $b (@cur_values){
        print $b . ", "
    }
    print "\n";
};

Вам просто нужно было использовать квадратные скобки при определении массива в строках 3 и 4.

2 голосов
/ 22 сентября 2011
my @arr = (
            { name => "aaa" , values => ["a1","a2"]      },
            { name => "bbb" , values => ["b1","b2","b3"] }
          );

Списки (сделанные с ()) будут сглажены.Arrayrefs ([]) не будет.

Подробнее см. perldoc perlreftut.

Кроме того, избегайте использования $a и $b в качестве имен переменных, так какони предназначены для специального использования внутри sort блоков.

...