Я получаю хэш хешей из другой функции, а некоторые элементы хэша хэшей могут быть другим хэшем. Как я могу проверить, есть ли что-то хеш?
Как я могу проверить, что "что-то" является хешем в Perl?
Ответ 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