eingaben evaluieren, aber die soll funktionieren
eingaben evaluieren, aber die soll funktionieren
am 14.11.2007 11:38:08 von Frank Kulow
Hallo NG,
eval <>;
sub s1
{
print "s1:";
open(HD,"
print "open";
}
hat den Nachteil, dass, wenn z.b. s1 eingebeben wird, bei fehler "die"
nicht ausgeführt wird.
Variante 2:
sub s1
{
print "s1:";
open(HD,"
print "open";
}
sub s2
{
print "s2:";
open(HD,"
print "open";
}
%h=('s1',\&s1,
's2',\&s2);
$i= <>;
chomp($i);
&{$h{$i}};
hat den Nachteil, dass der Hash %h gepflegt werden muss.
Gibt es eine Möglichkeit, die Nachteile zu vermeiden?
Danke Frank
Re: eingaben evaluieren, aber die soll funktionieren
am 14.11.2007 11:52:25 von Frank Seitz
Frank Kulow wrote:
>
> eval <>;
>
> sub s1
> {
> print "s1:";
> open(HD,"
> print "open";
> }
>
> hat den Nachteil, dass, wenn z.b. s1 eingebeben wird, bei fehler "die"
> nicht ausgeführt wird.
die() wird schon ausgeführt, aber du testest nach dem eval()
nicht drauf. Variable: $@.
> Variante 2:
[...]
>
> hat den Nachteil, dass der Hash %h gepflegt werden muss.
Der Weg ist sauberer. Eingaben ungeprüft auszuführen,
ist IMO nicht die tolle Idee.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: eingaben evaluieren, aber die soll funktionieren
am 14.11.2007 12:51:45 von Frank Kulow
Frank Seitz schrieb:
> Der Weg ist sauberer. Eingaben ungeprüft auszuführen,
> ist IMO nicht die tolle Idee.
aber so als Möglichkeit außerhalb des üblichen Programmflusses praktisch.
Ich hab da so eine sub:
$::doku{Verschiedenes}="alle vorhandenen subs werden per readlist zur
Auswahl gestellt und können mit einzugebenden Parametern aufgerufen werden";
sub Verschiedenes
{
my@subs;
my$s;
$s = Devel::Symdump->rnew;
@subs=$s->functions;
@subs=grep(/main::/,@subs);
map{$_=~s/^main:://} @subs;
if(@subs)
{
#readlist wählt aus übergebenem Array einen Eintrag aus
my$fcn=readlist(@subs);
print "Abbruch (enter) oder ausfuehren von $fcn(";
my$todo=<>;#argumente und bestätigen
chomp($todo);
eval "$fcn($todo" if $todo;
}
}
Kann ich die umschreiben, dass das "die" an Ort und Stelle ausgeführt wird?
Frank
Re: eingaben evaluieren, aber die soll funktionieren
am 14.11.2007 16:47:07 von Frank Seitz
Frank Kulow wrote:
>
> Kann ich die umschreiben, dass das "die" an Ort und Stelle ausgeführt wird?
Sicherlich, wenn du das tust, was ich in meinem ersten
Posting geschrieben habe.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: eingaben evaluieren, aber die soll funktionieren
am 15.11.2007 09:13:16 von Ferry Bolhar
Frank Kulow:
> eval "$fcn($todo" if $todo;
Da fehlt die abschließende Klammer. Hier wird "die" allerdings wirklich
nicht ausgeführt, weil es erst gar nicht zu dem Funktionsaufruf kommt.
> Kann ich die umschreiben, dass das "die" an Ort und Stelle ausgeführt
wird?
Ansonsten wird "die" ausgeführt: Füge die fehlende Klammer und nach
dem 'eval' die Zeile
print $@ if $@;
ein und du wirst es sehen.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf@wien.gv.at