Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 в любом случае.