¿Cómo enumero los métodos disponibles en un objeto o paquete dado en Perl?¿Cómo enumero los métodos disponibles en un objeto o paquete dado en Perl?
Respuesta
Si usted tiene un paquete llamado Foo, esto debe hacerlo:
no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';
Alternativamente, para obtener una lista de todos los métodos:
no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';
Hay (y no demasiado) muchos aspectos a haz esto en Perl porque hay muchas maneras de hacer las cosas en Perl. Como alguien comentó, los métodos automáticos siempre serán un poco complicados. Sin embargo, en lugar de plantear su propio enfoque, le sugiero que eche un vistazo al Class::Inspector en CPAN. Que le permitirá hacer algo como:
my @methods = Class::Inspector->methods('Foo::Class', 'full', 'public');
Finalmente he incluido Classline :: Inspector en línea en mi script de un solo archivo, esa es en realidad la solución más simple. Gracias. –
Tenga en cuenta que Class :: Inspector tiene limitaciones. Puede ver los métodos definidos, pero no maneja nada en UNIVERSAL. –
No es que la respuesta aceptada maneje UNIVERSAL tampoco ... – ephemient
si tiene un paquete que está utilizando Moose su razonablemente simple:
print PackageNameHere->meta->dump;
Y para los datos más completa:
use Data::Dumper;
print Dumper(PackageNameHere->meta);
obtendrá tú empezaste. Para todo lo demás, los theres los métodos que aparecen en ->meta
que se documentan en Class::MOP::Class
Puede hacer un poco de AdHoc falsificación de la bondad alces paquetes sin él con:
use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize(PackageNameHere);
y luego proceder a utilizar el Class :: MOP métodos como lo harías con Moose.
Para empezar:
$meta->get_method_map();
uso alces; #, es impresionante.
initialize devolverá la metaclase si está almacenada en la memoria caché, no es necesario verificarla manualmente, consulte por ejemplo las implementaciones para todo el azúcar en Moose.pm – perigrin
Hmm y con una mayor investigación, parece que estoy en lo cierto y lo que está mal. Class :: MOP :: class_of() manejará las instancias y los nombres de las clases, mientras que la función que inicializa usa (Class :: MOP :: get_metaclass_by_name()) * only * maneja los nombres de las clases. – perigrin
Kent - esto no funciona para mí - tal vez algo ha cambiado en el mundo de Moose. Tengo una esencia aquí: https://gist.github.com/rjattrill/6119205 –
En general, no puede hacer esto con un lenguaje dinámico como Perl. El paquete puede definir algunos métodos que puede encontrar, pero también puede crear métodos sobre la marcha que no tienen definiciones hasta que los use. Además, incluso llamar a un método (que funciona) podría no definirlo. Ese es el tipo de cosas que hacen que los lenguajes dinámicos sean agradables. :)
¿Qué tarea estás tratando de resolver?
- 1. ¿Cómo encontrar métodos anotados en un paquete dado?
- 2. ¿Cómo enumerar todos los métodos para un objeto en Ruby?
- 3. ¿Cómo se llama una subrutina de un paquete, dado el nombre del paquete en Perl?
- 4. ¿Puedo enumerar los recursos en un paquete dado?
- 5. Dado un objeto javascript arbitrario, ¿cómo puedo encontrar sus métodos?
- 6. ¿Cómo puedo exportar todos los subs en un paquete Perl?
- 7. ¿Cómo puedo deshacer un objeto en Perl?
- 8. métodos disponibles rubí
- 9. ¿Cómo enumero los complementos cargados en Vim?
- 10. ¿Cómo enumero todos los yanks en emacs?
- 11. ¿Cómo puedo descubrir programáticamente las propiedades y métodos de un objeto Win32 :: OLE en Perl?
- 12. ¿Cómo manejo los errores en cadenas de métodos en Perl?
- 13. ¿Cómo verifico los métodos que tiene un objeto en Python?
- 14. ¿Cómo enumero todos los campos de un objeto en Objective-C?
- 15. ¿Cómo se definen los métodos privados o internos en Perl orientado a objetos?
- 16. ¿Cómo puedo probar los métodos en un objeto de método?
- 17. ¿Cómo veo los métodos asociados con un objeto en Clojure?
- 18. Python: Call todos los métodos de un objeto con un conjunto dado de argumentos
- 19. ¿Cómo destruyes explícitamente un objeto en Perl?
- 20. ¿Cómo repito todos los métodos de una clase en Perl?
- 21. ¿Cómo enumero las propiedades de un objeto JavaScript?
- 22. ¿Los métodos incorporados de python están disponibles en un espacio de nombres alternativo en cualquier lugar?
- 23. ¿Cómo puedo documentar los métodos concisamente en el código Perl?
- 24. Cómo reemplazar un objeto en un NSMutableArray en un índice dado con un nuevo objeto
- 25. ¿Cómo enumero programáticamente todos los proyectos en una solución?
- 26. Capturar todos los métodos/llamadas de mensajes en un objeto
- 27. ¿Cómo enumero todas las vistas disponibles de una tabla particular en SQLite?
- 28. ¿Cómo puedo eliminar por completo un paquete en Perl?
- 29. Utilizando métodos disponibles en Plugin1 en plugin2 vía MEF
- 30. ¿Puedo inicializar una matriz a un tamaño dado en Perl?
Debe recurrir a las matrices @ISA también – Beano
Probar esto en XML :: Simple, Scalar :: Util y Exporter muestra todos los métodos que se exportan explícitamente. No obstante, recurrir a @ISA no debería ser tan difícil. –
Por supuesto, tendrá dificultades para encontrar métodos de carga automática. – innaM