警告 - perl中的“哈希分配中奇数个元素”

时间:2010-08-26 11:47:07

标签: 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[^>]+>"),
            );  

3 个答案:

答案 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];