Perl哈希中奇数个元素

时间:2016-01-11 09:19:55

标签: perl multidimensional-array hash

我在哈希问题上遇到了麻烦。我需要使用key =>获取版本列表值成对散列但仍然出错。下面的代码是我最近的尝试。一些字符串已被更改,并且不包含不需要的代码。

我看了整个网,但是找不到任何可以帮助我的东西。我已经使用了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.

转储时的%哈希是:

$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 = {&#39; stringN&#39; =&GT; {...}可以是任意数量的密钥=&gt;值对,但也会得到相同的错误。我有它工作,但它总是会产生错误。

$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'
             }
    # ...
}

1 个答案:

答案 0 :(得分:3)

这是因为您正在使用[这是匿名数组构造函数。请尝试使用{

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

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

哦,并缩进你的代码。那个for循环没有完成你(可能!)认为它完成的地方。特别是 - 检查return发生的位置。 (以及$jt设置的内容 - 它似乎与$i

无关