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

Как указать список доступных методов для данного объекта или пакета в Perl?

Как список доступных методов для данного объекта или пакета в Perl?

4b9b3361

Ответ 1

Если у вас есть пакет под названием Foo, это должно сделать это:

no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo symbol table
  print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';

В качестве альтернативы, чтобы получить список всех методов:

no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';

Ответ 2

В Perl существует (довольно) много способов сделать это, потому что в Perl существует так много способов сделать что-то. Как заметил кто-то, автозагруженные методы всегда будут немного сложными. Однако вместо того, чтобы использовать собственный подход, я бы предложил вам взглянуть на Class:: Inspector на CPAN. Это позволит вам сделать что-то вроде:

my @methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

Ответ 3

если у вас есть пакет, который использует Moose его достаточно просто:

print PackageNameHere->meta->dump;

И для более полных данных:

use Data::Dumper;
print Dumper( PackageNameHere->meta ); 

Вы начнете. Для всего остального, theres методы, которые появляются на ->meta, которые задокументированы в Class::MOP::Class

Вы можете сделать немного AdHoc-фальсификацию лося для пакетов без него:

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );

а затем приступайте к использованию методов Class:: MOP, подобных вам с Moose.

Для начала:

 $meta->get_method_map(); 

использовать Moose; #, его удивительный.

Ответ 4

В общем, вы не можете сделать это с помощью динамического языка, такого как Perl. Пакет может определять некоторые методы, которые вы можете найти, но он также может создавать методы "на лету", которые не имеют определений, пока вы их не используете. Кроме того, даже вызов метода (который работает) может не определять его. Это то, что делает динамические языки приятными.:)

Какую задачу вы пытаетесь решить?