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

Shu*_*ham 8 perl

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

my %data_variables = ("Sno." => (5,0),
                "ID" => (20,1), 
                "DBA" => (50,2), 
                "Address" => (80,3), 
                "Certificate" => (170,4),
            );
Run Code Online (Sandbox Code Playgroud)

但是我在使用类似的语法时没有得到类似的警告.

my %patterns = ("ID" => ("(A[0-9]{6}?)"),
                "Address" => (">([^<]*<br[^>]+>[^<]*)<br[^>]+>Phone"),
                "Phone" => ("Phone: ([^<]*)<"),
                "Certificate" => ("(Certificate [^\r\n]*)"),
                "DBA" => ("<br[^>]+>DBA: ([^<]*)<br[^>]+>"),
            );  
Run Code Online (Sandbox Code Playgroud)

FMc*_*FMc 13

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

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

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

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

  • 只是一个狡辩(澄清):哈希值*是*标量 - 并且在每个可能的哈希构造函数中都是标量.如果希望键引用*结构*,则必须指定该结构.如果您传递一个列表而不是一个arrayref,Perl会很乐意将该列表拆分为交替的键和值.问题是它构造了一个你不想要的哈希.` "斯诺".=> 5,'0'=>'ID','20'=> 1,......` (6认同)

jkr*_*mer 11

区别在于"..."是一个字符串(单个标量),(5, 0)是两个标量的列表.所以在第一个片段中,你实际上是这样做的:

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

由于散列只是具有偶数个元素的列表,所以当元素数量是偶数时,这将起作用,但如果它像您的示例中那样奇怪则会失败.

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