Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12674[/thread]

Prüfen ob "sub xyz" vorhanden ist

Leser: 12


<< >> 9 Einträge, 1 Seite
Hagen
 2008-10-26 13:26
#115754 #115754
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Hallo!

Über

Code (perl): (dl )
1
2
my $my_sub = 'test_sub';
my $erg = &$my_sub($parameter);


oder
Code (perl): (dl )
1
2
3
my $my_modul = 'test';
require "$my_modul.pm";
my $erg = test_sub ($parameter); # test_sub steht in 'test.pm'


habe ich je nach Parameter die Möglichkeit unterschiedliche Script-Teile auszuführen. Problematisch wird das ganze nur, wenn 'test_sub' doch nicht vorhanden ist. Gibt es einen Möglichkeit, dies vorher zu prüfen?

Gruß

Hagen
Gruß
Hagen
RPerl
 2008-10-26 13:35
#115755 #115755
User since
2006-11-26
384 Artikel
BenutzerIn

user image
eval() koennte klappen.
moritz
 2008-10-26 13:38
#115756 #115756
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Du könntest in der Symboltabelle nachschauen (siehe perlmod), oder auch einfach ein eval { ... } um den Funktionsaufruf basteln, um damit mögliche Fehler abzufangen.

Eine dritte Möglichkeit ist es, mit packagename->can("subname") danach zu fragen:

Code: (dl )
1
2
3
4
$ perl -wle 'sub foo { }; print  __PACKAGE__->can("foo")'
CODE(0x8812678)
$ perl -wle ' print __PACKAGE__->can("foo")'
Use of uninitialized value in print at -e line 1.
pq
 2008-10-26 16:18
#115759 #115759
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
RPerl: wenn du eval vorschägst, dann weise doch bitte auch noch auf die gefahren hin!
mit eval kann ich dem skript jeden string unterschieben, wenn der string von aussen kommt,
und damit jeden code ausführen lassen.
eine dispatch-tabelle ist das, was man will. aufs blaue rumprobieren, na was haben wir denn
für subroutinen, die passen, ist in den meisten fällen einfach schlechtes design.
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
murphy
 2008-10-26 16:38
#115760 #115760
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@pq: Hier ist sicher kein eval '...' gemeint, sondern ein eval { ... }, und letzteres ist harmlos.

Ich würde in diesem Falle aber auch eher auf UNIVERSAL::can zurückgreifen – wenn man einen Fehler vermeiden kann, indem man eine Abfrage einbaut, so ist das meistens der bessere Weg, als den Fehler abzufangen.
When C++ is your hammer, every problem looks like your thumb.
RPerl
 2008-10-26 18:34
#115764 #115764
User since
2006-11-26
384 Artikel
BenutzerIn

user image
pq: Jo, tu' ich hiermit. eval() kann boese sein und sollte nie ungefilterte, user-kontrollierte Variablen von aussen enthalten.
Hatte nur als ich den post gemacht hatte wenig Zeit.

nepos
 2008-10-27 09:22
#115772 #115772
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Würde hier auch UNIVERSAL::can() bevorzugen. Alles andere hat irgendwie was unsauberes an sich ;)
Ishka
 2008-10-27 09:39
#115773 #115773
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
if(exists &test_sub)
  {
  test_sub();
  }else{
  warn "test_sub gibt es nicht";
  }
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Hagen
 2008-10-27 09:41
#115774 #115774
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Prima, danke für die Hinweise.

Für die Entwicklung werde ich dann mal eval einsetzten ... später dann aber auf jeden Fall die Var. zusätzlich filtern.
Gruß
Hagen
<< >> 9 Einträge, 1 Seite



View all threads created 2008-10-26 13:26.