【问题标题】:Warning - "Odd number of elements in hash assignment" in perl警告 - perl 中的“散列分配中的奇数个元素”
【发布时间】:2010-08-26 11:47:06
【问题描述】:

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

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

【问题讨论】:

  • Perl 的列表扁平化再次来袭。列表扁平化具有有益的效果,但对于那些不习惯它的人来说,它也常常令人困惑。一个好处的例子是不需要特殊的应用函数(en.wikipedia.org/wiki/Apply),您可以构建函数参数的数据结构并简单地使用它。

标签: perl


【解决方案1】:

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

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

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

在您的第二个示例中,括号是多余的,只会混淆问题。每组括号只包含一个标量值(一个字符串),每一个都成为一个哈希值。

【讨论】:

  • 只是一个小问题(澄清):散列值标量——并且在每个可能的散列构造函数中都是标量。如果你想让一个键引用一个结构,你必须指定那个结构。如果你传递一个列表而不是一个数组引用,Perl 会很高兴地将该列表拆分为交替的键和值。问题是它构造了一个你不想要的散列。 "Sno." =&gt; 5, '0' =&gt; 'ID', '20' =&gt; 1, ...
【解决方案2】:

不同之处在于“...”是一个字符串(单个标量),(5, 0) 是两个标量的列表。所以在第一个 sn-p 中,你实际上是在这样做:

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

由于哈希只是具有偶数个元素的列表,因此当元素数为偶数时这将起作用,但如果它像您的示例中那样奇怪,则会失败。

如果要将数组作为值存储在哈希中,请改用[5, 0]

【讨论】:

    【解决方案3】:

    您试图将列表作为哈希元素放入,它会将它们视为更多的键/值对。您真正想要做的是放置数组引用,例如

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 2013-11-24
      • 2016-04-15
      • 2013-02-05
      • 2013-07-16
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多