2013-04-15 4 views
0

SO.Perl DBI - 초기화되지 않은 값 사용

Perl의 DBI를 사용하여 Perl 스크립트에서 Oracle 데이터베이스를 쿼리하고 있습니다. fetchrow_hashref를 사용하여 반환 된 행을 가져옵니다 (나중에 열 이름이 필요하기 때문에). 반환 된 행을 배열에 넣고 해당 배열에 대한 참조를 반환합니다. 그래서 기본적으로 해시에 대한 참조 배열에 대한 참조를 반환합니다. 이런 식으로 뭔가 :

my $sth = $dbh->prepare($query); 
$sth->execute(); 

# Fetch all rows returned as hash references and put each of those 
# references into the array @rows 
@returned_rows =(); 
while ($row = $sth->fetchrow_hashref()) { 
    push(@returned_rows, $row); 
} 

# Return a reference to the array @rows 
# Return a reference to an array of hash references 
return \@returned_rows; 

필드 중 하나가 null로 오면, 내가 얻을 : 나는 데이터베이스에서 null 값을 기대했기 때문에 나는 미확정 테스트해도하지만, OK입니다

Use of uninitialized value in concatenation (.) or string at sqlesl.pl line 49. 

, 나는 DBI 문서가 정확히 있어야한다고 생각하지 않는 동일한 에러를 보게된다 :

fetchrow_arrayref의 대안. 다음 데이터 행을 가져오고 은 필드 이름과 필드 값 쌍을 포함하는 해시에 대한 참조로이를 반환합니다. null 필드는 해시에서 undef 값으로 반환됩니다.

위의 스 니펫을 테스트하는 데 사용한 코드 조각입니다. * $ rows_ref *가 위의 스 니펫이 반환하는 값이라고 가정 해 보겠습니다.

@rows = @$rows_ref; 
$hash_ref = $rows[0]; 
%hash = %$hash_ref; 
@keys = keys %hash; 

foreach $key (@keys) { 
    next if (undef($hash{$key})); 
    print "$key: $hash{$key}\n"; 
} 

누군가이 빛에 비추는 빛이 있습니까? 사전에

감사합니다.

+1

참고 : 조건에서는 defined를 대신 사용한다 'yourself – stevenl

답변

2

undef은 인수를 정의 해제하는 함수입니다. 당신은`@returned_rows를 채울 필요가 없습니다 $ sth-> fetchall_arrayref ({})는`hashref 행의 arrayref를 얻기 위해`호출 할 수 있습니다

next unless defined $hash{$key}; 
+1

@horhay 또한'존재하는 $ hash {$ key} '라고 생각할 수도 있습니다 –

+0

두 분 모두 고마워요! 두 솔루션 모두 내가 필요한 것입니다. – romeroqj

관련 문제