2014-01-16 70 views
2

我寫了下面這段代碼來嘗試在hashref中打印出值。 hashref來自DBI $statement->fetchrow_hashref()方法。Perl未初始化的值錯誤

我想使用"string + $variable"鍵來訪問元素的值。當我運行的代碼,我得到了以下錯誤:

Use of uninitialized value $value in string eq at main.pl line 19.

我以爲我嘗試使用它之前檢查的價值,所以我不知道怎麼回事,以趕上元素test3是空的。

use strict; 
use warnings; 

# list is actually a hashref from DBI query 
my $list = {"test1" => 'true=yes', "test2" => 'false=no', "test3" => ''}; 
my $value = ""; 

my_function($list); 

sub my_function { 

    my ($list) = @_; 

    # Loop through values 
    foreach my $i(1..6) { 

     $value = $list->{"test$i"}; 

     if(undef $value || $value eq "") { 
      next; 
     } 

     my ($k, $v) = split('=', $value); 

     print "$k = $v\n"; 
    } 
} 

此外,我很好奇hashref和常規散列之間的區別。

回答

8

致電undef $value$valueundef

您需要使用defined代替,這樣

if (not defined $value or $value eq "") { 
    next; 
} 

next unless defined $value and $value ne ''; 

還要注意的是,只有Perl的值除了undef和空字符串是零值和字符串"0",所以排除所有這些的最簡單的方法只是

next unless $value; 

但在你的情況下,這也會排除像test4 => 0test5 => '0'這些你可能不想要的元素。

+3

替代選擇:'next if!defined($ value)|| !length($ value);'[在5.12之前]和'next如果!length($ value);'[5.12+] – ikegami

+0

除非長度爲$ value,否則不會更簡單嗎? –