Undefined subroutine &main::A
alex
- perl
Hi,
ich hab mal ne Frage bezüglich Perl.
Ich habe ein Script X worin eine Funktion A definiert wird.
In einem anderes Script Y require ich dann X.
In Script Y nutz ich dann die Funktion A, das hat alles wunderbar geklappt bisher, nur seit gestern sagt er mir:
Undefined subroutine &main::A in ...
wobei für die Buchstaben schon ordentliche Namen vergeben wurden...
Die Zeile die den Fehler angibt ruft auch die Funktion auf, aber obwohl die Funktion eingebunden ist rafft Perl das nicht, weiss jemand da nen Rat?
Script X hat am Ende auch das 1; und ich nutze in allen Scripten das strict Pragma. Aber es ist wie verhext.
danke
alex
Die Zeile die den Fehler angibt ruft auch die Funktion auf, aber obwohl die Funktion eingebunden ist rafft Perl das nicht, weiss jemand da nen Rat?
Bist du sicher, dass Perl das nicht rafft? Was ist dein Script X, ein stinknormales Perlscript oder ein Package? Im ersten Falle verstehe ich die Fehlermeldung nicht, aber im zweiten Fall wäre sie normal (Stichwort Namensräume). Zeige also mal den relevanten Code.
Siechfred
X ist nur ein perl Script, kein Package.
__SCRIPTANFANG: range.cgi__
#!/usr/bin/perl
use strict;
use File::Find;
my $smallest;
my $biggest;
sub range {
return unless ( $File::Find::name =~ /(\d+).$/ );
$smallest = $1 if ( !$smallest || $1 < $smallest );
$biggest = $1 if ( !$biggest || $1 > $biggest );
}
sub get_ID_Range {
my ( $path ) = @_;
return unless ( -d $path );
find( &range, $path );
return unless ( $smallest =~ /^\d+$/ && $biggest =~ /^\d+$/ );
return [ $smallest, $biggest ];
}
1;
__SCRIPTENDE__
das wird bei mir im Hauptscript per
require "range.cgi";
aufgerufen und es kommt die Fehlermeldung ...
__AUSZUGANFANG__
$range = get_ID_Range( $$C{Global}{BackupPath} );
__ENDEAUSZUG__
beide dateien liegen im gleichen pfad und wenn ich das require auskommentiere kommt die gleiche fehlermeldung.
wenn ich ein eval um das require mache kommt nix in $@ an.
auch "require or die $!" gibt nix aus...
alex.
Die Zeile die den Fehler angibt ruft auch die Funktion auf, aber obwohl die Funktion eingebunden ist rafft Perl das nicht, weiss jemand da nen Rat?
Bist du sicher, dass Perl das nicht rafft? Was ist dein Script X, ein stinknormales Perlscript oder ein Package? Im ersten Falle verstehe ich die Fehlermeldung nicht, aber im zweiten Fall wäre sie normal (Stichwort Namensräume). Zeige also mal den relevanten Code.
Siechfred
X ist nur ein perl Script, kein Package.
Somit muss die Funktion auch im Namensraum "main" verfügbar sein.
__SCRIPTANFANG: range.cgi__
So, wie die Codeschnipsel da stehen, müsste es ohne jede Fehlermeldung funktionieren.
Die einzig logische Erklärung scheint mir, dass irgendwo in den in @INC enthaltenen Pfaden ein Script gleichen Namens herumschwirrt, das die Subroutine get_ID_Range nicht anbietet. Denn wenn Perl in diesen Pfaden fündig wird, sucht es nicht weiter und würde dein Script (das im gleichen Pfad wie dein einbindendes Script) galant ignorieren. Also gib dem Script doch mal einen anderen Namen und binde es dann ein.
Siechfred
ja das dachte ich auch. allerdings gibt es diese funktion definitiv nur in diesem file und da stören mögliche doppelte require anweisungen eigentlich nicht...
naja, ich schreib das eh um und mach mal ordentliche module draus...
thx für die mühe
alex
Die einzig logische Erklärung scheint mir, dass irgendwo in den in @INC enthaltenen Pfaden ein Script gleichen Namens herumschwirrt, das die Subroutine get_ID_Range nicht anbietet. Denn wenn Perl in diesen Pfaden fündig wird, sucht es nicht weiter und würde dein Script (das im gleichen Pfad wie dein einbindendes Script) galant ignorieren. Also gib dem Script doch mal einen anderen Namen und binde es dann ein.
Siechfred
ja das dachte ich auch. allerdings gibt es diese funktion definitiv nur in diesem file und da stören mögliche doppelte require anweisungen eigentlich nicht...
Du hast mich offenbar nicht richtig verstanden. In @INC stehen alle Pfade, in denen Perl nach Dateien sucht, die du mit do, require oder use anforderst. Und der letzte Eintrag erst ist '.' für das aktuelle Verzeichnis, deshalb sucht Perl erst ganz zum Schluss im aktuellen Verzeichnis.
Nun könnte es sein, dass jemand in einem der in @INC *vor* '.' genannten Pfade ein Script gespeichert hat, das zufällig genauso wie deines heißt, eventuell warst du es unabsichtlich selber. Und dieses Script bietet die von dir gesuchte Sub nicht an.
Abhilfe würde ein einfaches Umbenennen der gewünschten Datei schaffen. Da du das offenbar nicht versucht hast, würde es mich trotzdem mal interessieren, ob das Umbenennen helfen würde.
Siechfred
Nun könnte es sein, dass jemand in einem der in @INC *vor* '.' genannten Pfade ein Script gespeichert hat, das zufällig genauso wie deines heißt, eventuell warst du es unabsichtlich selber. Und dieses Script bietet die von dir gesuchte Sub nicht an.
passiert einem gerne mal mit "Test", da ein solches Modul bei der Standardinstallation dabei ist (zumindest bei ActiveState Perl)
Struppi.
nope, ich programmier an dem projekt alleine.
die funktion steht definitiv nur in dieser range.cgi
und nein, umbenennen hatte nicht geholfen...
ich hab jetzt das als modul umgeschrieben und da macht perl auch mit :)
alex
ja das dachte ich auch. allerdings gibt es diese funktion definitiv nur in diesem file und da stören mögliche doppelte require anweisungen eigentlich nicht...
Du hast mich offenbar nicht richtig verstanden. In @INC stehen alle Pfade, in denen Perl nach Dateien sucht, die du mit do, require oder use anforderst. Und der letzte Eintrag erst ist '.' für das aktuelle Verzeichnis, deshalb sucht Perl erst ganz zum Schluss im aktuellen Verzeichnis.
Nun könnte es sein, dass jemand in einem der in @INC *vor* '.' genannten Pfade ein Script gespeichert hat, das zufällig genauso wie deines heißt, eventuell warst du es unabsichtlich selber. Und dieses Script bietet die von dir gesuchte Sub nicht an.
Abhilfe würde ein einfaches Umbenennen der gewünschten Datei schaffen. Da du das offenbar nicht versucht hast, würde es mich trotzdem mal interessieren, ob das Umbenennen helfen würde.
Siechfred