Как найти, какой тип объекта я имею на Perl?

Как я могу найти, с каким типом объекта я имею дело в Perl? Я пытался использовать жемчуг-d для ввода отладчика, но я не уверен, что сделать тогда. Аналогично я хотел бы способ легко видеть, какие методы доступны для каждого объекта, как это может быть сделано?

30
задан John 19 January 2010 в 04:21
поделиться

4 ответа

Лучшее решение было бы не делать любой логики в конструкторах. Просто создайте объект, и хорошо идти. Если вам действительно нужно что-то сделать в конструкторе, инкапсулируйте его с помощью попытки, наконец, выясните, где вы освобождаете неуправляемые ресурсы.

-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 . Если вы видите те, которые в списке объект может сделать больше, но что все это делает, вы не знаете.

  • Универсальный «Базовый класс» , потому что этот класс содержит поведение, используемое объектом.

Удачи.

30
ответ дан 28 November 2019 в 00:14
поделиться

Функция Благословен из Scalar :: util скажет вам имя пакета любой благословенной ссылки (объект.)

, чтобы найти Из каких методов доступны, обратитесь к документации для этого пакета. В качестве альтернативы вы можете использовать что-то вроде Class :: MOP :: Class для создания метакласса и получить интроспективную информацию о методах, которые он содержит.

5
ответ дан 28 November 2019 в 00:14
поделиться

Вы ищете отражение в 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

0
ответ дан 28 November 2019 в 00:14
поделиться
  1. Это больше похоже на то, как работает мозг (что не обязательно может быть вычислительным преимуществом, но многие люди исследуют NN, чтобы получить представление о том, как работает разум, а не решать проблемы реального мира.
  2. Его легче достичь некоторых видов инвариантности с использованием большего количества слоев. Например, классификатор изображений, который работает независимо от того, где на изображении найден объект, или от размера объекта. см. Буври, Дж., Л. Розаско и Т. Поджио. «О неизменности в иерархических моделях». Достижения в системах обработки нейронной информации (NIPS) 22, 2009.
-121--3348466-

Если вы хотите играть с такого рода вещами, то 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 в любом случае.

3
ответ дан 28 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: