Ich habe ein Basisobjekt namens RuleObject und ein Objekt, das von dem namens RuleObjectString erbt. Ich habe eine neue Methode in RuleObjectString, die ich in meinem Code aufrufen möchte, der dieses Objekt verwendet. Aber ich bekomme den Fehler. 'Die Objektmethode "compare" kann nicht über das Paket "RuleObject" in der Zeile ./testobject.pl gefunden werden.' Aber ich erstelle kein RuleObject. Ich erstelle einen RuleObjectString. Was mache ich hier falsch?Erweitern eines Objekts in Perl
testobject.pl
1 #! /usr/bin/perl
2
3 use strict;
4
5 use RuleObjectString;
6
7 my $s = RuleObjectString->new();
8 $s->value('stuff goes here');
9
10 if ($s->compare('stuff')){
11 print "MATCH!\n";
12 }else{
13 print "no match :(\n";
14 }
RuleObject.pm
package RuleObject;
our @ISA = qw/Exporter/;
our @EXPORT = qw/new/;
use strict;
sub new{
my $class = shift;
my $self;
$self->{value} = undef;
bless $self;
return $self;
}
sub value{
my $self = shift;
my $value = shift;
if ($value){
$self->{value} = $value;
}else{
return $self->{value};
}
}
RuleObjectString.pm
package RuleObjectString;
our @ISA = qw/RuleObject/;
our @EXPORT = qw/compare/;
use strict;
sub compare{
my $self = shift;
my $compareto = shift;
return $self->value() =~ /$compareto/;
}
Sie sollten Ihre Klassen- und Instanzmethoden nicht "EXPORTIEREN", und Ihre Module sollten normalerweise nicht "Exporter" erben, es sei denn, sie haben bona fide prozedurale Funktionen zum Exportieren. – pilcrow
Und für Fälle, in denen Sie * Funktionen * exportieren müssen, ist 'Sub :: Exporter' viel nutzerfreundlicher als' Exporter'. Sie sollten jedoch wahrscheinlich vermeiden, Funktionen aus Paketen zu exportieren, die ebenfalls Klassendefinitionen sind. ' –