Я получаю предупреждение с использованием следующего синтаксиса -
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[^>]+>"),
);
Вам нужно заменить круглые скобки на квадратные. :
my %data_variables = (
"Sno." => [5,0],
"ID" => [20,1],
"DBA" => [50,2],
"Address" => [80,3],
"Certificate" => [170,4],
);
Хэш-значения должны быть скалярными, поэтому ваши списки чисел должны храниться как ссылки на массивы (отсюда и квадратные скобки).
В вашем втором примере скобки лишние и только запутывают дело. Каждый набор скобок содержит только одно скалярное значение (строку), каждое из которых становится хэш-значением.
Разница в том, что "..." — это строка (один скаляр), а (5, 0)
— список из двух скаляров. Итак, в первом фрагменте вы на самом деле делаете следующее:
my %data_variables = ("Sno.", 5, 0, "ID", 20, 1, "Address", 80, 3, "Certificate", 170, 4);
Поскольку хэши — это просто списки с четным количеством элементов, это будет работать, когда количество элементов четное, но не получится, если оно нечетное, как в вашем примере.
Если вы хотите хранить массивы как значения в хеше, используйте вместо этого [5, 0]
.
Вы пытаетесь поместить список в виде хэш-элементов, а он видит их как дополнительные пары ключ/значение. Что вы действительно хотите сделать, так это поместить ссылки на массив, например
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];