Scalar::Util::reftype()
- самое чистое решение. Модуль Scalar::Util
был добавлен в ядро Perl в версии 5.7, но доступен для более старых версий (5.004 или новее) из CPAN.
Вы также можете зондировать с помощью UNIVERSAL::isa()
:
$x->isa('HASH') # if $x is known to be an object
UNIVERSAL::isa($x, 'HASH') # if $x might not be an object or reference
Очевидно, вам также нужно проверить типы ARRAY
и SCALAR
. Модуль UNIVERSAL (который служит базовым классом для всех объектов) является частью ядра с Perl 5.003.
Другой способ - простой, но немного грязный - состоит в том, чтобы систематизировать ссылку. Предполагая, что в классе нет перегруженной строковой классификации, вы получите что-то похожее на Class=HASH(0x1234ABCD)
, которое вы можете проанализировать для извлечения базового типа данных:
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);