2013-04-30 2 views
5

hashref에 0 개 요소가 있는지 여부를 테스트해야합니다. 은이 코드를 사용 :펄에서 해시 참조가 비어 있는지 확인하는 방법

$self = { fld => 1 }; 
%h = ("a" => "b"); 
$self->{href} = { %h }; 
print STDERR $self->{href}{ "a" }; 
print STDERR "\n"; 
print "size of hash: " . keys(%h) . ".\n"; 
print "size of hashref: " . keys($self->{href}) . ".\n"; 

그것은 펄 5.16으로 잘 작동을하지만, 펄 5.10와 함께 실패

Type of arg 1 to keys must be hash (not hash element) at - line 7, near "}) " 
Execution of - aborted due to compilation errors. 

답변

12

: 최대의 호환성을 위해, 당신은 먼저 역 참조 할 필요가 그것의

keys %{ $self->{href} } 

참고 : 어떤 버전의 P erl, keys은 참조를 허용합니다. 그러나 이것은 버려진 실험적인 기능이었습니다. 하나는 그것을 사용해서는 안됩니다. 당신은 해시로 역 참조 할 필요가

+0

를 얻을. Perl의 모든 버전에서 똑같이 작동합니까? –

+0

아니요. 포기한 실험적인 기능이었습니다. – ikegami

+0

이 값은 비어 있거나 0입니까? – landesko

2

에만 새로운 Perls에서 지원됩니다 keys 같은 내장 기능 참조를 사용. 당신이 해시에 대한

%hash 

를 사용하는 것, 그래서 만약 당신이 참조

%{ $hash } 

를 사용하는 것,

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
2

: 그것은 어떤 키가 있는지 확인하려면 TIMTOWTDI를 들어

print "size of hashref: ", keys %{ $self->{href} }, "\n"; 

, 당신은 keys 필요하지 않습니다 :

print "undefined" unless %{ $self->{href} }; 
+1

그는 사용중인 Perl 버전에서 마지막 스 니펫이 불필요하게 전체 해시를 반복합니다. 그냥 fyi. – ikegami

1

가 있는지 확인하려면 해시 요소를 가지고, 당신은 단지 스칼라 문맥에서 사용 :

scalar %h 

또는

,
%h ? "yup" : "nope" 

scalar keys %h%h에 키를 계산하여 동일한 목적을 수행하지만, 당신이 실제로 알고 싶은 것을 요청하는 것이 좋습니다.

그러나 어느 경우에도 %h은 해시이며 해시 참조가 아닙니다. (일부 버전의 Perl에서는 해시 참조를 keys에 대한 인수로 허용하지만 해시 참조로 평가되는 EXPR이라는 표현식을 사용하면 %{ EXPR }이라는 해시가 반환됩니다. {}`if 문에 - _ref_는이`경우 (> { 'HREF'}! 키 $ 자기를) 할 가능성이 해시가 아닌 경우 샘플 코드와 함께이 퍼팅, 우리는

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n"; 
관련 문제