2013-04-30 3 views
5

Мне нужно проверить, содержит ли мой hashref 0 элементов. Я использовал этот код:Как проверить, является ли хеш-ссылка пустой в perl

$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"; 

Это хорошо работает с Perl 5.16, но терпит неудачу с Perl 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

Если вы хотите использовать

%hash 

для хэша, вы бы использовать

%{ $hash } 

для справки, так это

keys %{ $self->{href} } 

Примечание: В некоторых версиях P erl, keys принимает ссылку. Однако это была экспериментальная функция, которая была оставлена. Его не следует использовать.

+0

Если _ref_ не хэш, можно сделать это 'если (ключи $ самостоятельно -!> {«HREF»}) {}', если заявление. Будет ли работать одинаково во всех версиях Perl? –

+0

Нет. Это была экспериментальная функция, которая была оставлена ​​без внимания. – ikegami

+0

Получает ли это возврат пустым или 0? – landesko

2

Использование ссылок с встроенными функциями, как keys поддерживается только в новой Перлз. Для обеспечения максимальной совместимости, вам необходимо разыменования него первым:

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

Вы должны разыменования его как хэш:

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

Для TIMTOWTDI, чтобы проверить, если он имеет какие-либо ключи, вам не нужно keys:

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

В версии Perl он использует, чтобы последний фрагмент без лишних слов перебирал весь хэш. Просто фью. – ikegami

1

Чтобы узнать, хэш имеет элементы, вы просто использовать его в скалярном контексте:

scalar %h 

или

%h ? "yup" : "nope" 

scalar keys %h выполняет ту же цель путем подсчета ключей в %h, но это лучше спросить за то, что вы на самом деле хотите знать.

В любом случае, %h является хешем, а не hashref. (Хотя некоторые версии Perl допускают hashref в качестве аргумента для keys.) Учитывая выражение EXPR, которое оценивает hashref, вы получаете соответствующий хэш, говоря %{ EXPR }. Сведя вместе с примерами кода, мы получаем

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n"; 
Смежные вопросы