Wertzuweisung an Variable in Variable
Steffen
- perl
0 Alexander (HH)0 Alexander (HH)0 Steffen1 Alexander (HH)0 steckl0 Steffen
0 Struppi
Hallo,
wusste nicht, wie ich das Thema nennen sollte.
Ich habe folgendes Problem.
In einer foreach-Schleife steht in einer Variablen $feld ein Name z.B "name1", im zugehörigen Feld $value steht ein Wert.
Jetzt will ich dem Feld $name diesen Wert zuweisen.
Dies könnte ich natürlich umständlich machen durch
if ($feld eq "name1") {$name1 = $wert}
elsif ($feld eq "name2") {$name2 = $wert}
........
Kann ich direkt aus dem Inhalt von $feld die skalare Variable (im obigen Beispiel $name1 ...) erzeugen und ihr den Wert zuordnen?
Den korrekten Namen (mit $) in $feld anzugeben geht nicht.
Moin Moin!
Möchtest Du vielleicht lieber einen Hash benutzen?
Alexander
Moin Moin!
Guckst Du hier: How can I use a variable as a variable name?
Alexander
Hi,
vielleicht gibt es eine andere Möglichkeit?
Von einem Formular erhalte ich die Werte der Parameter
name1, name2, .....
durch $name1 = $query->param('name1');
$name2 = $query->param('name2');
.... und, und, und ....
Schön wäre es, dies zu bewerkstelligen, ohne jeden Parameter hier einzeln aufzuführen.
Moin Moin!
Hi,
vielleicht gibt es eine andere Möglichkeit?
Von einem Formular erhalte ich die Werte der Parameter
name1, name2, .....
durch $name1 = $query->param('name1');
$name2 = $query->param('name2');
Das sieht nach CGI aus.
.... und, und, und ....
Schön wäre es, dies zu bewerkstelligen, ohne jeden Parameter hier einzeln aufzuführen.
Speichere die Parameter-Werte in einem Hash.
my %data=();
foreach my $name (qw(name1 name2 foo bar baz)) {
$data{$name}=$query->param($name);
}
Falls $query eine Instanz von CGI ist, und Du alle Parameter in einem Hash haben möchtest, kannst Du damit anfangen:
my %data=map { $_ => [ $query->param($_) ] } $query->param();
Damit hast Du einen Hash voller Array-Referenzen, jede einzelne speichert alle Werte eines Parameters (denn CGI-Parameter können mehrere Werte haben, z.B: bei Checkboxen -- und im Gegensatz zu PHP braucht Perl keine Markierungen am Parameternamen).
Ein Aufruf von script.cgi?foo=1;bar=23;foo=42;name1=9 liefert Dir dann
%data=(
name1 => [ 9 ],
foo => [ 1, 42 ],
bar => [ 23 ],
);
Alexander
Hallo,
danke erstmal.
Das von Dir vorausgesagte Ergebnis erhalte ich leider nicht.
Bei mir ist der hash leer (wenn ich alles richtig gemacht habe).
Ich verstehe leider den folgenden Ausdruck nicht, so dass ich auch nicht herumprobieren kann.
Mit welchem print erhalte ich den Wert von name1?
my %data=map { $_ => [ $query->param($_) ] } $query->param();
>
> Damit hast Du einen Hash voller Array-Referenzen, jede einzelne speichert alle Werte eines Parameters (denn CGI-Parameter können mehrere Werte haben, z.B: bei Checkboxen -- und im Gegensatz zu PHP braucht Perl keine Markierungen am Parameternamen).
>
> Ein Aufruf von script.cgi?foo=1;bar=23;foo=42;name1=9 liefert Dir dann
>
> ~~~perl
> %data=(
> name1 => [ 9 ],
> foo => [ 1, 42 ],
> bar => [ 23 ],
> );
>
Vielen Dank!
Moin Moin!
Hallo,
danke erstmal.
Das von Dir vorausgesagte Ergebnis erhalte ich leider nicht.
Bei mir ist der hash leer (wenn ich alles richtig gemacht habe).
Ich verstehe leider den folgenden Ausdruck nicht, so dass ich auch nicht herumprobieren kann.
Versuch mal die exzellente Dokumentation zu lesen, dann brauchst Du nicht unendlich viele Affen an unendlich vielen Schreibmaschinen zu simulieren.
Fang mit http://perldoc.perl.org/5.8.8/perlintro.html an, dann http://perldoc.perl.org/5.8.8/perlreftut.html, http://perldoc.perl.org/5.8.8/perllol.html, http://perldoc.perl.org/5.8.8/perlref.html, http://perldoc.perl.org/5.8.8/CGI.html, http://perldoc.perl.org/5.8.8/Data/Dumper.html. Folge Links in den Dokumenten.
Mit welchem print erhalte ich den Wert von name1?
*DEN* impliziert, dass es exakt einen Wert gibt. Im CGI-Umfeld kann es zu einem Parameternamen auch mal KEINEN Wert oder BELIEBIG VIELE Werte geben.
if (exists $data{'name1'}) {
foreach my $value (@{$data{'name1'}}) {
print "name1=$value\n";
}
# für den 43. Wert:
print $data{'name1'}->[42];
}
# für eine Übersicht aller Werte
use Data::Dumper;
print Dumper(\%data);
my %data=map { $_ => [ $query->param($_) ] } $query->param();
Die param()-Methode des CGI-Moduls liefert eine Liste aller Parameternamen, wenn man sie selbst ohne Argumente aufruft. map iteriert über diese Liste, setzt $\_ nacheinander auf jedes einzelne Element der Liste, und liefert eine Liste aller Rückgabewerte des Blocks unmittelbar hinter map. Für jeden einzelnen Wert der ersten Liste liefert dieser Block eine Liste mit exakt zwei Elementen, dem Parameternamen und einer Array-Referenz, die den Rückgabewert der param()-Methode für den Parameternamen im Listenkontext (sprich: alle CGI-Parameter-Werte für den Parameternamen) enthält. Diese Liste wird schließlich an %data zugewiesen, wobei das erste, dritte, fünfte, ... Element der Liste als Schlüssel und der zweite, vierte, sechste, ... Element als dazugehörender Wert benutzt werden.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
my %data=map { $_ => [ $query->param($_) ] } $query->param();
>
> Die param()-Methode des CGI-Moduls liefert eine Liste aller Parameternamen, wenn man sie selbst ohne Argumente aufruft. map iteriert über diese Liste, setzt $\_ nacheinander auf jedes einzelne Element der Liste, und liefert eine Liste aller Rückgabewerte des Blocks unmittelbar hinter map.
Nur als Ergänzung, das CGI Modul kennt darüber hinaus die Funktion [Vars](http://perldoc.perl.org/CGI.html#FETCHING-THE-PARAMETER-LIST-AS-A-HASH%3a)
Struppi.
Moin Moin!
Nur als Ergänzung, das CGI Modul kennt darüber hinaus die Funktion Vars
Richtig, die hat aber bezüglich Multi-Value-Parametern ein sehr unglückliches Verhalten, dass den Wertebereich einschränkt und zusätzliche Klimmzüge bei der Verarbeitung erfordert.
Alexander
Hallo!
Mit Eurer Hilfe bin jetzt schon gut vorangekommen. Jetzt habe ich aber noch eine Frage.
Ist die Reihenfolge der Abarbeitung eines arrays durch foreach willkürlich oder ist gewährleistet, dass in der Reihenfolge der Einträge (indices) vorgegangen wird?
Danke
Steffen
Ist die Reihenfolge der Abarbeitung eines arrays durch foreach willkürlich oder ist gewährleistet, dass in der Reihenfolge der Einträge (indices) vorgegangen wird?
JA! (oder meinst du ein Hash?)
JA! (oder meinst du ein Hash?)
Danke, ich meinte schon ein array.
Hallo,
vielen Dank für die Hilfe.
Das hat mir viel weitergeholfen!
Gruss
Steffen
Hi,
Von einem Formular erhalte ich die Werte der Parameter
name1, name2, .....
durch $name1 = $query->param('name1');
$name2 = $query->param('name2');
.... und, und, und ....
Schön wäre es, dies zu bewerkstelligen, ohne jeden Parameter hier einzeln aufzuführen.
Wenn die Parameter alle nameX heißen könntest du es ja so machen:
my @namen;
for(my $i = 1; $i < 9; $i++)
{
$namen[$i] = $query->param("name$i");
}
Dann hast du anschließend die Werte der Formular-Felder name1 bis name8 in einem Array namen.
(nicht getestet)
mfG,
steckl
Hi,
name1,name2,.. waren Beispiele. In der Praxis können es beliebige Namen sein.
Gruss
Steffen
if ($feld eq "name1") {$name1 = $wert}
elsif ($feld eq "name2") {$name2 = $wert}
Was ist den $feld? Wozu dieser Vergleich.
Da mittlerweile bekannt ist, dass du das CGI Modul verwendest vermute ich dass das was du da vorhast auf anderen Wege besser lösbar wäre, dazu müßte man aber konkret wissen was du willst.
Struppi.