Как я могу проверить, что "что-то" является хешем в Perl? - PullRequest
24 голосов
/ 24 сентября 2010

Я получаю хэш хэшей от другой функции, и некоторые элементы хэша хэшей могут быть другим хэшем. Как я могу проверить, является ли что-то хешем?

Ответы [ 4 ]

40 голосов
/ 24 сентября 2010

В зависимости от того, что вы хотите, вам потребуется использовать ref или reftype (который находится в Scalar::Util, основной модуль).Если ссылка является объектом, ref вернет класс объекта вместо базового ссылочного типа, reftype всегда вернет базовый ссылочный тип.

if (ref $var eq ref {}) {
   print "$var is a hash\n";
}

use Scalar::Util qw/reftype/;

if (reftype $var eq reftype {}) {
    print "$var is a hash\n";
}
15 голосов
/ 24 сентября 2010

Использование ref Функция:

ref($hash_ref) eq 'HASH' ## $hash_ref is reference to hash
ref($array_ref) eq 'ARRAY' ## $array_ref is reference to array

ref( $hash{$key} ) eq 'HASH' ## there is reference to hash in $hash{$key}
5 голосов
/ 24 сентября 2010

Я всегда использовал isa, но если проверяемая вещь не является объектом (или может не быть объектом), вам нужно вызвать его как функцию UNIVERSAL::isa:

if ( UNIVERSAL::isa( $var, 'HASH' ) ) { ... }
3 голосов
/ 24 сентября 2010
use Params::Util qw<_HASH _HASH0 _HASHLIKE>;

# for an unblessed hash with data
print "$ref is a hash\n" if _HASH( $ref ); 
# for an unblessed hash empty or not
print "$ref is a hash\n" if _HASH0( $ref ); 
# for a blessed hash OR some object that responds as a hash*
print "$ref is hashlike\n" if _HASHLIKE( $ref );

* - overload

Впрочем, вам, вероятно, не нужен последний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...