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

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

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

Ответы [ 3 ]

20 голосов
/ 15 сентября 2008

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);
6 голосов
/ 05 сентября 2008

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

2 голосов
/ 03 сентября 2008

И моей первой мыслью по этому поводу было: «Объекты в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...