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

Как я могу определить тип блаженной ссылки в Perl?

В Perl объект является лишь ссылкой на любой из базовых типов данных Perl, которые были благословлены в конкретном классе. Когда вы используете функцию ref() на беспредметной ссылке, вам сообщают, к какому типу данных относятся контрольные точки. Однако, когда вы вызываете ref() на блаженной ссылке, вы возвращаете имя пакета, в который была включена эта ссылка.

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

4b9b3361

Ответ 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