添加到Perl哈希产生令人费解的结果

时间:2012-09-17 21:06:59

标签: perl debugging hashmap

我对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而不是任何内容。有谁知道这里会发生什么?

3 个答案:

答案 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线。

相关问题