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