Как я могу найти, какой тип объекта я имею в Perl? Я попытался использовать perl -d для ввода отладчика, но я не уверен, что делать дальше. Аналогично, я хотел бы легко увидеть, какие методы доступны для каждого объекта, как это можно сделать?
Как найти, какой тип объекта у меня есть на Perl?
Ответ 1
Стандартный способ сообщить, какой тип объекта у вас есть: ref
или Scalar::Util
::blessed
. Если вы знаете, что объект благословлен, то они возвращают ту же информацию.
my $class1 = blessed( $obj );
my $class2 = ref $obj;
Но ref
также вернет "HASH" для бесполезных хэшей, а blessed
откажется играть в эту игру.
Что касается списка методов, для благословенного стиля указателя perl-объекта, достаточно легко закодировать его самостоятельно. Код ниже работает достаточно хорошо для меня. Он возвращает имена функций (те, которые берут "КОД КОДА" данного имени), сопоставленные с пакетом, который их определяет.
sub class_methods {
use Class::ISA;
my $obj = shift;
return unless ref( $obj );
my %meth_names;
foreach my $anc ( Class::ISA::self_and_super_path( ref $obj ), 'UNIVERSAL' ) {
my $stash = \%{"$anc\::"};
my @funcs
= grep { m/^[_\p{Alpha}]/ # begins with _ or alpha
&& !exists $meth_names{$_} # no clobbering
&& defined *{$stash->{$_}}{CODE} # has a filled CODE slot
} keys %$stash
;
# assign to the "hash slice", keyed by all the entries in @funcs
# the value of $anc repeated as many times as elements in @funcs.
@meth_names{@funcs} = ( $anc ) x @funcs;
}
return %meth_names;
}
-
Это будет работать и с достаточно сложными объектами, но если в собственном пакете содержится много сгенерированного кода, не будет полезно знать, в каком пакете генераторы вставляют указатель кода. больше, чтобы найти, какой пакет сгенерировал код.
-
В этом случае вы можете получить код из кода, в том числе
Data::Dumper
и установить$Data::Dumper::Deparse
до 1, например: (local $Data::Dumper::Deparse = 1;
), а затем сбросить указатель кода, например:say Dumper( $code_ref );
-
НЕ РАБОТАЕТ для действительных методов, которые еще не созданы никакими методами
AUTOLOAD
. Если вы увидите список в списке, объект может сделать больше, но что все это делает, вы не знаете. -
Включен "базовый класс"
UNIVERSAL
, потому что этот класс содержит поведение, применимое объектом.
Удачи.
Ответ 2
blessed
функция из Scalar::Util сообщит вам имя пакета любой блаженной ссылки (объект.)
Чтобы узнать, какие методы доступны, обратитесь к документации для этого пакета. В качестве альтернативы вы можете использовать что-то вроде Class::MOP::Class для создания метакласса и получения интроспективной информации о его методах.
Ответ 3
Просто для полноты, здесь очень короткое введение в отладчик.
perl -d your_program
запускает его под баггером. Вы получите контроль над первой исполняемой строкой (операторы использования и т.д. Уже выполнили на этом этапе).
's' перейдет к следующей строке. Когда вы введете 's', вы можете просто нажать return, чтобы повторить его. 's' перейдет в функции/подпрограммы/методы. Либо продолжайте движение до тех пор, пока вы не вернетесь или не войдете в команду "r", чтобы выполнить оставшуюся часть функции и вернуться вправо после вызова.
Если вы хотите выполнить "над" подпрограммы - то есть выполнить их и вернуться без необходимости входа и возврата, используйте "n" . Возврат каретки после первого "n" также продолжает делать "n" для вас.
Если вам известна строка, в которой вы хотите остановить, используйте команду "b" - b linenumber - для установки точки останова, затем "c", чтобы продолжить, пока вы не достигнете ее. Обратите внимание, что каждый раз, когда вы "c" и возвращаетесь в точку останова, вы снова останавливаетесь. Используйте "B linenumber", чтобы выключить точку останова.
Итак, предположим, что вы получили что-то вроде этого:
my $obj = complex_function_returning_unknown_thing;
Отладчик просто показал вам эту строку, в которой говорится: "Я еще не выполнил это, но это то, что я буду делать дальше". Введите 'n' для выполнения подпрограммы, затем используйте команду 'x', чтобы посмотреть на объект: 'x $obj'. Если он большой, вы можете сказать '| x $obj', который запускает вывод через пейджер. Чтобы узнать, какие методы имеет объект, используйте 'm $obj'.
В отладчике гораздо больше, но вы действительно можете использовать его для такого рода вещей - вам нужно просто увидеть тип объекта, который вы получаете от какого-либо кода, и узнать, какие методы у вас есть,.
Это может быть более полезно для "x" объекта, а затем перейти к источнику класса, в котором объект был благословлен, чтобы узнать, что вы должны делать, а не то, что вы можете сделать. Команда "x" в значительной степени "print ref ($ obj)", скрещенная с Data:: Dumper в любом случае.
Ответ 4
Вы ищете отражение в Perl. Я просто искал "Perl Reflection" без кавычек, и это получилось:
http://coding.derkeiler.com/Archive/Perl/perl.beginners/2004-10/0291.html
Edit: И это: http://markmail.org/message/i5mzik56ry4zoxxq
Edit: И это: http://en.wikipedia.org/wiki/Reflection_(computer_science)#Perl