2012-09-17 26 views
1

我对Perl有点新,而且这个错误让我困惑了几天。我很难在Google上找到任何具体问题。我会尽可能清楚地呈现“线索”。我正在使用Perl v5.16.1。在我的代码中的相关行是这些:添加到Perl哈希产生令人费解的结果

my %result =(); 

... 

$result{'TABLENAME'} = $tableName; 

... 

for my $i (1..$numberOfColumns) { 
    $result{$columnNames[$i-1]} = $columnValues[$i-1]; 
} 

在我的测试,$numberOfColumns为7的问题是,for循环如我所料不创建键值对。我会解释。我试过用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

给我们,实际上产生的问题代码! !或者至少,给出'use Data :: Djmper的输出; {local $ Data :: Dumper :: Useqq = 1;打印(Dumper(\ @ columnNames,\ @columnValues)); }'。最佳猜测,'$ columnNames [0] ne“id”'。 – ikegami

回答

4

如果我们看一下DB<10>,我们看到1上印下一行:

DB<10> p %result 
TABLENAMEmyowntableitisid 
1 

这意味着$result{"id\n"} eq "1",和您使用的是未定义的关键。

风格说明:foreach当然,在两个数组之间建立散列是可能的。但话又说回来,Perl有,这让生活变得更轻松(除非你正在处理令人难以置信的大量数据)

@result{@columnNames} = @columnValues; 

(假设@columnNames <= @columnValues

+0

谢谢!有用的指针恰好是我错过的线索,我还能要求什么。 :)当我写了两个数组的foreach时,我有点觉得Perl必须有更聪明的东西来处理这个问题,但我没有发现什么。谢谢你让我知道切片! – gsr

2

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

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

并且应该解决您的问题。或者,当您从文件中读取值时,您可以跺下这些值。

在附注中,习惯上将循环计数器作为索引本身。这是从0$numberOfColumns - 1或(甚至到$#columnNames)的循环。

+0

谢谢!你是对的换行符! – gsr

1

如果$result{id}为空,$result{"id\n"}会返回什么?你可能不是chomp

+0

谢谢!这是现货! – gsr