Предупреждение - «Нечетное количество элементов в назначении хэша» в perl - PullRequest
8 голосов
/ 26 августа 2010

Я получаю предупреждение с использованием следующего синтаксиса -

my %data_variables = ("Sno." => (5,0),
                "ID" => (20,1), 
                "DBA" => (50,2), 
                "Address" => (80,3), 
                "Certificate" => (170,4),
            );

Но я не получаю подобное предупреждение при использовании аналогичного синтаксиса.

my %patterns = ("ID" => ("(A[0-9]{6}?)"),
                "Address" => (">([^<]*<br[^>]+>[^<]*)<br[^>]+>Phone"),
                "Phone" => ("Phone: ([^<]*)<"),
                "Certificate" => ("(Certificate [^\r\n]*)"),
                "DBA" => ("<br[^>]+>DBA: ([^<]*)<br[^>]+>"),
            );  

Ответы [ 3 ]

13 голосов
/ 26 августа 2010

Вам необходимо изменить круглые скобки на квадратные скобки:

my %data_variables = (
    "Sno."        => [5,0],
    "ID"          => [20,1], 
    "DBA"         => [50,2], 
    "Address"     => [80,3], 
    "Certificate" => [170,4],
);

Хеш-значения должны быть скалярными, поэтому ваши списки чисел должны храниться в виде ссылок на массивы (отсюда и квадратные скобки).

В вашем втором примере скобки излишни и просто запутывают дело.Каждый набор скобок содержит только одно скалярное значение (строку), каждое из которых становится хеш-значением.

11 голосов
/ 26 августа 2010

Разница в том, что "..." - это строка (один скаляр), а (5, 0) - список из двух скаляров.Итак, в первом фрагменте вы на самом деле делаете это:

my %data_variables = ("Sno.", 5, 0, "ID", 20, 1, "Address", 80, 3, "Certificate", 170, 4);

Поскольку хэши - это просто списки с четным числом элементов, это будет работать, когда число элементов четное, но не удастся, еслистранный, как в вашем примере.

Если вы хотите сохранить массивы как значения в хэше, используйте вместо этого [5, 0].

3 голосов
/ 26 августа 2010

Вы пытаетесь поместить список в качестве элементов хэша, и он видит их как большее количество пар ключ / значение.То, что вы действительно хотите сделать, это поместить ссылки на массивы, например

my %data_variables = ("Sno." => [5,0],
                "ID" => [20,1], 
                "DBA" => [50,2], 
                "Address" => [80,3], 
                "Certificate" => [170,4],
            );

Вы можете ссылаться на элементы массива как

   my $foo = $data_variables{"Sno"}->[0];
   my $bar = $data_variables{"Address"}->[1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...