我在哈希问题上遇到了麻烦。我需要使用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'
}
# ...
}
答案 0 :(得分:3)
这是因为您正在使用[
这是匿名数组构造函数。请尝试使用{
。
如果你这样做可能会更加惯用:
$data{ $ver } = {
version => $jver,
available => $table_tree->cell($jt,1)->as_text,
};
哦,并缩进你的代码。那个for
循环没有完成你(可能!)认为它完成的地方。特别是 - 检查return
发生的位置。 (以及$jt
设置的内容 - 它似乎与$i
)