我收到使用以下语法的警告 -
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[^>]+>"),
);
答案 0 :(得分:12)
您需要将括号更改为方括号:
my %data_variables = (
"Sno." => [5,0],
"ID" => [20,1],
"DBA" => [50,2],
"Address" => [80,3],
"Certificate" => [170,4],
);
哈希值必须是标量值,因此您的数字列表需要存储为数组引用(因此是方括号)。
在你的第二个例子中,括号是多余的,只是混淆了这个问题。每组括号只包含一个标量值(一个字符串),每个标量值都成为一个哈希值。
答案 1 :(得分:10)
区别在于“...”是一个字符串(单个标量),(5, 0)
是两个标量的列表。所以在第一个片段中,你实际上是这样做的:
my %data_variables = ("Sno.", 5, 0, "ID", 20, 1, "Address", 80, 3, "Certificate", 170, 4);
由于哈希只是具有偶数元素的列表,所以当元素数量是偶数时,这将起作用,但如果它像你的例子中那样奇怪则会失败。
如果要将数组存储为散列值,请改用[5, 0]
。
答案 2 :(得分:2)
您尝试将列表放入哈希元素中,并将其视为更多键/值对。你真正想做的就是把数组引用,比如
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];