1

我对 Perl 有点陌生,这个错误让我困惑了几天。对于这个特定的问题,我很难在 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 而不是什么都没有。有谁知道这里会发生什么?

4

3 回答 3

5

如果我们查看DB<10>,我们会看到1打印在下一行:

DB<10> p %result
TABLENAMEmyowntableitisid
1

这意味着$result{"id\n"} eq "1", 并且您正在使用未定义的键。

风格说明:foreach当然,可以使用两个数组来构建哈希。但是话又说回来,Perl 有slices,这让生活变得更容易(除非你正在处理难以置信的大量数据)

@result{@columnNames} = @columnValues;

(假设@columnNames <= @columnValues

于 2012-09-17T21:20:21.350 回答
2

问题是columnnames[0]设置为"id\n"而不只是id. 注意 id 后面的换行符。我猜你是从文件中读取这些而不是删除换行符。值也是如此。添加到您的循环中:

chomp $columnNames[$i-1];
chomp $columnValues[$i-1];

那应该可以解决您的问题。或者,您可以从文件中读取这些值。

附带说明一下,习惯上将循环计数器作为索引本身。那是从0$numberOfColumns - 1或(甚至到$#columnNames)循环。

于 2012-09-17T21:15:19.730 回答
1

如果$result{id}为空,$result{"id\n"}返回什么?你可能没有大吃大喝

于 2012-09-17T21:15:30.790 回答