代码之家  ›  专栏  ›  技术社区  ›  Shubham

警告:Perl中的“哈希分配中元素的奇数”

  •  7
  • Shubham  · 技术社区  · 15 年前

    使用以下语法将收到警告-

    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 回复  |  直到 15 年前
        1
  •  12
  •   FMc TLP    15 年前

    您需要将括号改为方括号:

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

    哈希值必须是标量值,因此您的数字列表需要存储为数组引用(因此是方括号)。

    在第二个例子中,括号是多余的,只是混淆了问题。每一组括号只包含一个标量值(字符串),每个值都成为散列值。

        2
  •  10
  •   jkramer    15 年前

    区别在于“…”是一个字符串(单个标量),并且 (5, 0) 是两个标量的列表。所以在第一个片段中,您实际上是这样做的:

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

    因为散列只是包含偶数个元素的列表,所以当元素的数目为偶数时,这将起作用,但如果它像您的示例中那样奇数,则会失败。

    如果要将数组存储为哈希中的值,请使用 [5, 0] 相反。

        3
  •  2
  •   Paul Tomblin    15 年前

    您试图将一个列表作为散列元素放入,它将它们视为更多的键/值对。你真正想做的是放置数组引用,比如

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