我对Perl有点新鲜,这个bug让我困惑了好几天。我很难在Google上找到任何针对此问题的问题。我会尽可能清楚地提出“线索”。我使用的是Perl v5.16.1。我的代码中的相关行是:
my %result = ();
...
$result{'TABLENAME'} = $tableName;
...
for my $i (1..$numberOfColumns) {
$result{$columnNames[$i-1]} = $columnValues[$i-1];
}
在我的测试中,$numberOfColumns
是7.问题是for循环不会像我期望的那样创建键值对。我会解释。我已经尝试使用Perl的调试器和perl -d
进行调试。下面的调试器输出显示在最后一行之前一切正常。
DB<2> c 219
testcode::testsub(modules/testcode.pm:219):
219: $result{'TABLENAME'} = $tableName;
DB<3> c 239
testcode::testsub(modules/testcode.pm:239):
239: for my $i (1..$numberOfColumns) {
DB<4> p %result
TABLENAMEmyowntableitis
DB<5> p $result{TABLENAME}
myowntableitis
DB<6> s
testcode::testsub(modules/testcode.pm:240):
240: $result{$columnNames[$i-1]} = $columnValues[$i-1];
DB<6> p $i
1
DB<7> p $columnNames[0]
id
DB<8> p $columnValues[0]
1
DB<9> s
testcode::testsub(modules/testcode.pm:240):
240: $result{$columnNames[$i-1]} = $columnValues[$i-1];
DB<9> p $i
2
DB<10> p %result
TABLENAMEmyowntableitisid
1
DB<11> p $result{TABLENAME}
myowntableitis
DB<12> p $result{id}
DB<13>
我预计最后p $result{id}
会返回1而不是任何内容。有谁知道这里会发生什么?
答案 0 :(得分:4)
如果我们查看DB<10>
,我们会看到1
打印在下一行:
DB<10> p %result
TABLENAMEmyowntableitisid
1
这意味着$result{"id\n"} eq "1"
,您正在使用未定义的密钥。
样式注释:当然,foreach
可以通过两个数组构建哈希值。但话说再说一次,Perl有 slice ,这让生活变得更轻松(除非你处理大量的数据)
@result{@columnNames} = @columnValues;
(假设@columnNames <= @columnValues
)
答案 1 :(得分:2)
问题是columnnames[0]
设置为"id\n"
而不仅仅是id
。注意id之后的换行符。我猜你是从文件中读取这些内容而不是删除换行符。价值观也是如此。加入你的循环:
chomp $columnNames[$i-1];
chomp $columnValues[$i-1];
这应该可以解决您的问题。或者,您可以在从文件中读取值时选择值。
另一方面,习惯上让循环计数器成为索引本身。这是从0
到$numberOfColumns - 1
或(甚至到$#columnNames
)的循环。
答案 2 :(得分:1)
如果$result{id}
为空,$result{"id\n"}
会返回什么?你可能不是chomp线。