【问题标题】:Odd number of elements in Perl hashPerl哈希中的奇数个元素
【发布时间】:2016-04-15 13:02:21
【问题描述】:

我在使用哈希时遇到了一些问题。我需要将带有键 => 值对的版本列表放入哈希中,但一直出错。下面的代码是我最近的尝试。某些字符串已更改,并且不包含不需要的代码。

我浏览了整个网络,但找不到任何可以帮助我的东西。我已经使用 Perl 很长时间了,但没有太多使用哈希和数组。我的大部分 Perl 经验都与正则表达式和 shell 执行有关。如果我使用的是 PHP,我只会使用多维数组,但这是 Perl,我正在编写的脚本比显示的要多得多,否则我会切换到 PHP。

我感谢花时间提供帮助的人。谢谢!

sub sub1 {

    # Read file which populates @rows with each line. 

    my %data;
    for (my $i=2; $i <= scalar @rows - 1; $i++) {
        $ver =~ s/\s//m;
        $data{ $ver } = [ 
            'version',  $ver,
            'available',  $table_tree->cell($jt,1)->as_text,
            'bsupport',  $table_tree->cell($jt,2)->as_text,
            'ssupport',  $table_tree->cell($jt,3)->as_text,
            'eol',  $table_tree->cell($jt,3)->as_text,
            'utype',  $table_tree->cell($jt,5)->as_text,
            'lreleases',  $table_tree->cell($jt,7)->as_text
        ];
    };
    return %data;
}

sub check_ {

    # line 199 follows

    my (%hash) = @_; 
    print Dumper (\%hash)."\n";
}

my %data = sub1($file);
check_(%data);

警告:

Odd number of elements in hash assignment at ./file.pl line 199 (#1)
(W misc) You specified an odd number of elements to initialize a hash,
which is odd, because hashes come in key/value pairs.

转储时的 %hash 为:

$VAR1 = {
      'string1' => [
               'version',
               'string1',
               'available',
               'stringa',
               'bsupport',
               'stringb',
               'ssupport',
               'stringc',
               'eol',
               'stringd',
               'utype',
               'stringe',
               'lreleases',
               'stringf'
             ],
    'string2' => [
               'version',
               'string2',
               'available',
               'stringa',
               'bsupport',
               'stringb',
               'ssupport',
               'stringc',
               'eol',
               'stringd',
               'utype',
               'stringe',
               'lreleases',
               'stringf'
             ],
    'string3' => [
               'version',
               'string3',
               'available',
               'stringa',
               'bsupport',
               'stringb',
               'ssupport',
               'stringc',
               'eol',
               'stringd',
               'utype',
               'stringe',
               'lreleases',
               'stringf'
             ],
    # ...
}

我最初试图让我的状态如下。其中 $VAR1 = { 'stringN' => { ... } 将是具有任意数量的键 => 值对的任意数字,但也会得到相同的错误。我让它工作了,但它总是会产生错误。

$VAR1 = {
    'string1' => {
               'version' => 'string1',
               'available' => 'stringa',
               'bsupport' => 'stringb',
               'ssupport' => 'stringc',
               'eol' => 'stringd',
               'utype' => 'stringe',
               'lreleases' => 'stringf'
             },
    'string2' => {
               'version' => 'string2',
               'available' => 'stringa',
               'bsupport' => 'stringb',
               'ssupport' => 'stringc',
               'eol' => 'stringd',
               'utype' => 'stringe',
               'lreleases' => 'stringf'
             },
    'string3' => {
               'version' => 'string3',
               'available' => 'stringa',
               'bsupport' => 'stringb',
               'ssupport' => 'stringc',
               'eol' => 'stringd',
               'utype' => 'stringe',
               'lreleases' => 'stringf'
             }
    # ...
}

【问题讨论】:

    标签: perl multidimensional-array hash


    【解决方案1】:

    这是因为您使用的是[,它是匿名数组构造函数。尝试改用{

    如果你这样做可能会更惯用:

     $data{ $ver } = { 
        version =>   $jver,
        available =>   $table_tree->cell($jt,1)->as_text,
     };
    

    哦,缩进你的代码。 for 循环并没有在你(可能!)认为它完成的地方完成。特别是 - 检查return 发生的位置。 (而 $jt 的设置是什么 - 它似乎与 $i 无关)

    【讨论】:

    • 不相关,但在“更惯用”标题下:for my $i (2 .. $#rows) {
    • 我选择了这个答案,因为它是创建哈希的正确方法。我的警告消息实际上来自一个空数组,该数组是通过添加断点并使用 perl -d script.pl 找到的。
    猜你喜欢
    • 2012-07-20
    • 2016-05-19
    • 2013-11-01
    • 1970-01-01
    • 2015-12-08
    • 2012-04-28
    • 1970-01-01
    • 2019-07-30
    • 2012-02-01
    相关资源
    最近更新 更多