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