Ist es möglich, alle gültigen Methoden für eine bestimmte Perl-Klasse zu erhalten?Ist es möglich, alle gültigen Methoden für eine bestimmte Perl-Klasse zu erhalten?
Ich versuche, die Symboltabelle einer Klasse zu manipulieren und alle Methoden zu erhalten. Ich fand heraus, dass ich die Subroutinen von den Nicht-Subroutinen über die $obj->can($method)
trennen kann, aber das tut nicht genau, was ich denke, dass es tut.
Der folgende Code gibt:
subroutine, Property, croak, Group, confess, carp, File
ist jedoch subroutine
kein Verfahren, (nur ein Unterprogramm) und croak
, confess
und alle in mein Paket importiert wurden.
Was will ich wirklich auszudrucken ist:
Property,Group, File
Aber ich nehme:
subroutine, Property,Group, File
Unten ist mein Programm:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
my $sections = Section_group->new;
say join ", ", $sections->Sections;
package Section_group;
use Carp;
sub new {
return bless {}, shift;
}
sub Add {
my $self = shift;
my $section = shift;
}
sub Sections {
my $self = shift;
my @sections;
for my $symbol (keys %Section_group::) {
next if $symbol eq "new"; # This is a constructor
next if $symbol eq "Add"; # Not interested in this method
next if $symbol eq "Sections"; # This is it's own method
push @sections, $symbol if $self->can($symbol);
}
return wantarray ? @sections : \@sections;
}
sub subroutine {
my $param1 = shift;
my $param2 = shift;
}
sub Group {
my $self = shift;
my $section = shift;
}
sub File {
my $self = shift;
my $section = shift;
}
sub Property {
my $self = shift;
my $section = shift;
}
Dann wieder manchmal Leute importieren tatsächlich eine Methode aus einem anderen Paket (z. B. 'exporter 'import';' im Gegensatz zu '@ISA = qw (Exporter);'). – cjm
@cjm Natürlich, aber ich denke, das passiert nicht oft, und kann sogar ein Antipattern sein. Hoffentlich haben die meisten Leute die prozedurale Programmierung (mit Importen) von OOP getrennt (was viele Namespace-Probleme löst). Es gibt keine Möglichkeit zu wissen, ob ein importiertes Sub eine Methode sein sollte, also muss das gut genug sein. (Warte, vielleicht, wenn wir auf das Attribut ': method' zugreifen können ...) – amon
_Das ist ziemlich trivial_. Trivial? Sie bauen Tachyonen-Generatoren an den Wochenenden? Perldoc on ** svref_2object **: _Nimmt einen Verweis auf einen beliebigen Perl-Wert an und wandelt den referenzierten Wert in ein Objekt in der entsprechenden B :: OP-abgeleiteten oder B :: SV-abgeleiteten Klasse um._ Ich habe keine Ahnung was es spricht davon. Es funktioniert jedoch. Ich denke, es ist an der Zeit für mich, mich mit dem bisher Ungelösten zu beschäftigen und mein Perl-Spiel ein bisschen mehr zu verbessern. Entweder das, oder lerne Python. –