Как я могу найти, с каким типом объекта я имею дело в Perl? Я пытался использовать жемчуг-d для ввода отладчика, но я не уверен, что сделать тогда. Аналогично я хотел бы способ легко видеть, какие методы доступны для каждого объекта, как это может быть сделано?
Лучшее решение было бы не делать любой логики в конструкторах. Просто создайте объект, и хорошо идти. Если вам действительно нужно что-то сделать в конструкторе, инкапсулируйте его с помощью попытки, наконец, выясните, где вы освобождаете неуправляемые ресурсы.
-121--3690571- Стандартный способ рассказать, какой тип объекта у вас есть либо
, либо Scalar :: Util
:: Blessed
. Если вы знаете , объект благословен, то они возвращают ту же информацию.
my $class1 = blessed( $obj );
my $class2 = ref $obj;
Но
также вернется «хэш» для небесных хэшей, а благословен
отказывается играть в эту игру.
Что касается списка методов, для стиля благословенного указателя объекта 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;
}
Это будет работать в разумно сложных объектах, но если владение пакет содержит много сгенерированного кода, оно не будет так полезно знать, в каком пакете генераторы заставили указатель кода. Это будет означать более Найдите, какой пакет создал код.
Это в том, что вы могут получить код выхода из кода, в том числе Данные :: DUMPER
и настройки $ Data :: Dumper :: DarseSe
до 1, вроде так: ( локальные $ data :: dumper :: deparse = 1;
), а затем сбросьте указатель кода, как так: скажем, DUMPER ($ code_ref);
Это не будет работать на допустимые методы, которые еще не создавались любыми методами Autoload
. Если вы видите те, которые в списке объект может сделать больше, но что все это делает, вы не знаете.
Универсальный «Базовый класс»
, потому что этот класс содержит поведение, используемое объектом.
Удачи.
Функция Благословен
из Scalar :: util скажет вам имя пакета любой благословенной ссылки (объект.)
, чтобы найти Из каких методов доступны, обратитесь к документации для этого пакета. В качестве альтернативы вы можете использовать что-то вроде Class :: MOP :: Class для создания метакласса и получить интроспективную информацию о методах, которые он содержит.
Вы ищете отражение в Perl. Я просто гугламил «Перл отражение» без кавычек, и это появилось:
http://coding.derkeiler.com/archive/perl/perl.beginners/2004-10/0291.html
Редактировать: И это: http://markmail.org/message/i5mzik56ry4zoxxq
Редактировать: И это: http://en.wikipedia.org/wiki/reflection_ (Computer_science) #perl
Если вы хотите играть с такого рода вещами, то Linux - это путь.
Загрузчик является частью ядра, но, так как у вас есть доступ ко всему источнику ядра, вы можете играть с ним с содержанием ваших сердец.
-121--4213445-Просто для полноты, вот очень короткое введение в отладчик.
perl -d your_program
запускает его под баггером. Вы получите управление в первой исполняемой строке (операторы use и т.п. уже выполнены на данном этапе).
«s» перейдет к следующей строке. Как только вы ввели 's', вы можете просто нажать на return, чтобы повторить его. 'уйдет в функции/подпрограммы/методы. Либо продолжайте переходить, пока не вернетесь, либо введите команду '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 в любом случае.