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

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

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[^>]+>"),
            );  
8
задан Shubham 26 August 2010 в 11:47
поделиться

3 ответа

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

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

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

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

13
ответ дан 5 December 2019 в 06:08
поделиться

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

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

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

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

11
ответ дан 5 December 2019 в 06:08
поделиться

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

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];
3
ответ дан 5 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: