Сведения о вопросе

FELL

00:11, 4th August, 2020

Теги

perl   reference   types    

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

Просмотров: 499   Ответов: 3

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

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



  Сведения об ответе

lool

06:28, 14th August, 2020

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);


  Сведения об ответе

ITSME

06:23, 1st August, 2020

Наверное, тебе не стоит этого делать. Базовый тип объекта - это деталь реализации, с которой не стоит связываться. Зачем тебе это знать?


  Сведения об ответе

appple

08:45, 6th August, 2020

И моей первой мыслью на этот счет было: "Objects in Perl are always hash refs, so what the hack?"

Но, 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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться