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

Funktionsaufruf per String eval

Leser: 3


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Escape
 2008-08-02 21:12
#113020 #113020
User since
2008-07-24
312 Artikel
BenutzerIn
[default_avatar]
Ich binde via require ein Script ein dessen Bezeichner vom einbinden Script ermittelt wird.
Aus dem einbinden Script heraus, habe ich auch den Namen ($sub_name) einer Funktion die in dem einzubindenden Script enthalten ist.
Diese Funktion liefert die Refferenz auf ein, innerhalb des eingebundenen Scripts enthaltenes, Array zurück.

Wenn ich nun schreibe:
@array = @{eval "$sub_name()"};
dann habe ich (wie erwartet) Zugriff auf die Elemente der Varibalen @array.

Warum aber kann ich auch schreiben:
@array = @{eval "$sub_name"};
oder:
@array = @{eval "&$sub_name"};

und erreiche auch damit eine Zuweisung zu @array?

P.S. Heißt es nun eigentlich der Array oder das Array?
Die Deutsche Rechtschreibung ist Freeware; Du darfst sie kostenlos nutzen – aber sie ist nicht Open Source, d.h. Du darfst sie nicht verändern und/oder in veränderter Form veröffentlichen.
Struppi
 2008-08-02 21:15
#113021 #113021
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wieso überhaupt eval?
Code (perl): (dl )
$sub_name->()

sollte auch reichen.
FoolAck
 2008-08-02 21:49
#113024 #113024
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Du könntest auch qq{eval "&$sub_name()"} machen. Schaustu hier.
Quote
To call subroutines:

NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.


Bedenke btw was passiert, wenn dein "$sub_name" qq{system "rm -rf /"} oder so enthält. (Sprich die "Gefahr" von eval.)
Und afaik heißt es das Array. (Und auch das Hash.)

@Struppi: das ist keine subref.
edit: woah, das ist ja möglich. Allerdings nur ohne 'strict refs'. Aber ist glaube ich besser als per string eval.
Escape
 2008-08-03 02:30
#113033 #113033
User since
2008-07-24
312 Artikel
BenutzerIn
[default_avatar]
FoolAck+2008-08-02 19:49:54--
Du könntest auch qq{eval "&$sub_name()"}

Das wäre dann so etwas wie &sub_name()
igitt ;)

FoolAck+2008-08-02 19:49:54--
Bedenke btw was passiert, wenn dein "$sub_name" qq{system "rm -rf /"} oder so enthält. (Sprich die "Gefahr" von eval.)

Kann in dem von mir geschilderten Fall unter keinen Umständen passieren.

FoolAck+2008-08-02 19:49:54--
Und afaik heißt es das Array. (Und auch das Hash.)

Da ist sich die (deutsprachige) Literatur offensichlich nicht so ganz einig ;)

P.S. Alle bisherigen Antworten bezogen sich aber nicht auf meine ursprüngliche Frage.
Die Deutsche Rechtschreibung ist Freeware; Du darfst sie kostenlos nutzen – aber sie ist nicht Open Source, d.h. Du darfst sie nicht verändern und/oder in veränderter Form veröffentlichen.
Struppi
 2008-08-03 04:23
#113035 #113035
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl -w
 
use strict;
my $x = 'test';

no strict 'refs';
my @x = $x->();
print "@x";

 sub test {
 my @array =qw(a b c d);
 return @array
 }
Gast Gast
 2008-08-03 10:34
#113036 #113036
Hallo,

der Ausdruck oder der Block, der hinter eval steht wird ausgeführt - wenn im Namensraum der Unterprogramme der entsprechende Name existiert, wird dieses Unterprogramm ausgeführt.

In allen drei Fällen steht hinter eval der Name eines existierenden Unterprogramms.

siehe dazu die Beschreibung in perlfunc

zu PS - das Feld -> das Array
betterworld
 2008-08-03 22:43
#113043 #113043
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
FoolAck+2008-08-02 19:49:54--
Und afaik heißt es das Array. (Und auch das Hash.)

Ich glaube eher, es heißt "der Hash". Wenn Du die Datenstruktur meinst.
betterworld
 2008-08-03 22:46
#113044 #113044
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Escape+2008-08-03 00:30:27--
P.S. Alle bisherigen Antworten bezogen sich aber nicht auf meine ursprüngliche Frage.

Dafür hast Du noch nicht geschrieben, warum Du überhaupt eval benutzen willst. Wie die anderen schon geschrieben haben: Es geht auch ohne, und das ist wirklich zu bevorzugen, selbst wenn man sich sicher ist, dass der Code sicher ist.

Zu der eigentlichen Frage: Die Klammern kann man weglassen, wie FoolAck schon geschrieben hat.
So weit ich das sehe, ist das dann auch eine Zuweisung an das Array.
Dubu
 2008-08-04 02:47
#113052 #113052
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
betterworld+2008-08-03 20:43:25--
FoolAck+2008-08-02 19:49:54--
Und afaik heißt es das Array. (Und auch das Hash.)

Ich glaube eher, es heißt "der Hash". Wenn Du die Datenstruktur meinst.

Der Rechtschreibduden (23. Aufl von 2004) kennt keines von beiden, das Duden Universalwörterbuch (6. Aufl. von 2007) kennt den und das Array, aber kein(en) Hash. :)
Edit: Ach ja, für mich ist es das Array und der Hash. Warum auch immer.
defun
 2008-08-04 03:40
#113053 #113053
User since
2008-07-18
28 Artikel
BenutzerIn
[default_avatar]
Definitiv der Hash. Allein schon, weil es im Kamel-Buch so übersetzt wurde. Und eigentlich finde ich "das" Array ziemlich affig (will sagen: gestochen). Der Array ist mir da lieber. Das Kamel-Buch ist da aber wohl anderer Meinung: Auf Seite 9 steht: "Sie können ein Array verwenden..." Und bei einem männlichen Array hätte es wohl heißen müssen "einen Array".
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-08-02 21:12.