Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В зависимости от того, что вы хотите, вам нужно будет использовать 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";
}

Ответ 2

Используйте 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}

Ответ 3

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

if ( UNIVERSAL::isa( $var, 'HASH' ) ) { ... }

Ответ 4

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

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

см. Params::Util