В Perl объект - это просто ссылка на любой из базовых типов данных Perl, который был выделен в определенный класс. Когда вы используете функцию ref () для необъявленной ссылки, вам сообщается, на какой тип данных указывает ссылка. Однако когда вы вызываете ref () для благословенной ссылки, вам возвращается имя пакета, в который была благословлена ссылка.
Я хочу знать фактический основной тип благословенной ссылки. Как я могу это определить?
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);
И моя первая мысль об этом была: «Объекты в Perl всегда хэш-ссылки, так что за хак?»
Но Scalar :: Util :: reftype - это ответ. Спасибо, что поставили вопрос здесь.
Вот фрагмент кода, чтобы доказать это .. (на случай, если он кому-нибудь пригодится).
$> perl -e 'использовать строгий; использовать предупреждения «все»; мой $ х = [1]; благослови ($ x, "ABC :: Def"); использовать Data :: Dumper; распечатать самосвал $ x; печать ref ($ x). "\ П"; используйте Scalar :: Util "reftype"; выведите reftype ($ x). "\ П" ' `
Вывод:
$ VAR1 = благослови ([ 1 ], 'ABC :: Def'); ABC :: Def ARRAY
Вы, вероятно, не должны этого делать. Базовый тип объекта - это деталь реализации, с которой не стоит связываться. Зачем вам это знать?