Schrift
[thread]6226[/thread]

Prüfen ob eine Subroutine vorhanden ist?

Leser: 3


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Strat
 2004-04-30 12:26
#81941 #81941
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du koenntest im Hash %:: nachsehen, ob es da was mit namen der Subroutine gibt (%:: funktioniert aber nur mit package main; fuer andere packages musst du auf %packagename:: ausweichen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2004-04-30 13:58
#81942 #81942
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du kannst den Aufruf in ein eval { ... } einpacken und den Fehlerwert danach pruefen. Existiert die Funktion nicht, wird $@ auf /Undefined subroutine/ matchen.
ptk
 2004-04-30 18:19
#81943 #81943
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,30.April.2004, 15:35][quote=ptk,30.04.2004, 11:58]Du kannst den Aufruf in ein eval { ... } einpacken und den Fehlerwert danach pruefen. Existiert die Funktion nicht, wird $@ auf /Undefined subroutine/ matchen.[/quote]
achtung: sowas kann gefaehrlich sein, weil die funktion ja im eval ausgefuehrt wird... wenn du wirklich nur wissen willst, ob sie existiert, bleibt wohl nur meine Loesung von oben. Wenn du sie hingegen ausfuehren willst, ist der eval-Ansatz wohl besser...
[/quote]Genau. Wobei dein Ansatz nicht immer funktioniert, insbesondere nicht, wenn per AUTOLOAD nachgeladen wird. Fuer das Testen auf Existenz von Subroutinen gilt ungefaehr das gleiche wie beim Testen, ob eine Datei lesbar oder schreibbar ist: solange man die Aktion nicht durchfuehrt, kann man sich nie sicher sein.

Quote
Ein weiterer Ansatz ist, AUTOLOAD zu verwenden; wenn das Script dann in der Subroutine AUTOLOAD haengt, weisst du, dass was schiefgegangen ist
Es sein denn, es wird bereits AUTOLOAD verwendet.
pq
 2004-04-30 21:27
#81944 #81944
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ähm... wieso nicht ganz einfach:
Code: (dl )
1
2
3
if (main->can('name_der_sub')) {}
# oder
if (Package::Name->can('name_der_sub')) {}

?

edit: can() liefert praktischerweise auch noch die subroutine,
also:
Code: (dl )
1
2
3
if (my $sub = main->can('name')) {
 $sub->($parameter);
}
\n\n

<!--EDIT|pq|1083346125-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
vougie
 2004-04-30 10:20
#81945 #81945
User since
2004-04-12
8 Artikel
BenutzerIn
[default_avatar]
Moin moin,

hat jemand eine Idee wie ich prüfen kann, ob eine Subroutine existiert? Ich kann das nicht über den return wert machen! Den brauch ich für was anderes...

besten dank
- vougie
tomlong
 2004-04-30 13:17
#81946 #81946
User since
2003-08-04
93 Artikel
BenutzerIn
[default_avatar]
[quote=vougie,30.04.2004, 08:20]Ich kann das nicht über den return wert machen! Den brauch ich für was anderes...[/quote]
dann setz doch nen 2. return wert :)
Live long and prosper!
42;
Strat
 2004-04-30 17:35
#81947 #81947
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=ptk,30.04.2004, 11:58]Du kannst den Aufruf in ein eval { ... } einpacken und den Fehlerwert danach pruefen. Existiert die Funktion nicht, wird $@ auf /Undefined subroutine/ matchen.[/quote]
achtung: sowas kann gefaehrlich sein, weil die funktion ja im eval ausgefuehrt wird... wenn du wirklich nur wissen willst, ob sie existiert, bleibt wohl nur meine Loesung von oben. Wenn du sie hingegen ausfuehren willst, ist der eval-Ansatz wohl besser...

Ein weiterer Ansatz ist, AUTOLOAD zu verwenden; wenn das Script dann in der Subroutine AUTOLOAD haengt, weisst du, dass was schiefgegangen ist, z.B.

Code: (dl )
1
2
3
4
use vars qw($AUTOLOAD);
sub AUTOLOAD {
print "Die Subroutine $AUTOLOAD konnte nicht geladen werden\n";
} # AUTOLOAD

oder so aehnlich
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
betterworld
 2004-04-30 18:36
#81948 #81948
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wir hatten doch vor ein paar Monaten mal so einen Bug in aelteren Perl-Versionen entdeckt, dass in %:: ein Beitrag ergaenzt wird, wenn man versucht, eine nichtexistente Sub aufzurufen. Ich kann mich nicht mehr genau erinnern, und ich glaube es war im alten Forum.
pq
 2004-04-30 21:30
#81949 #81949
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
und was hat das überhaupt mit CGI zu tun? ich verschieb das mal nach 'Allgemeines'...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2004-05-03 14:25
#81950 #81950
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man muss erst auf die Idee kommen, "can" ausserhalb von OO zu nutzen... :-)
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-04-30 12:26.