Wie kann man zwei Variablen von einem Unterprogramm übernehmen??
Joachim
- perl
0 Slyh0 Klaus Mock
Hi
Wie kann man zwei Variablen von einem Unterprogramm übernehmen??
Das funktioniert nicht!
sub Datenaufbereitung
{
local @formularfelder;
local ($name, $daten, $input);
$input = $_[0];
@formularfelder = split(/&/, $input);
foreach $feld (@formularfelder)
{
($name, $daten) = split(/=/, $feld);
$daten =~ s/+/ /go;
$daten =~ s/%(..)/pack("C", hex($1))/eg;
@d[$i] = $daten;
@c[$i] = $name;
$i = $i + 1;
}
return (@d,@c);
}
($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!
Danke
Hi,
foreach $feld (@formularfelder)
{
($name, $daten) = split(/=/, $feld);
$daten =~ s/+/ /go;
$daten =~ s/%(..)/pack("C", hex($1))/eg;
@d[$i] = $daten;
@c[$i] = $name;
$i = $i + 1;
Wieso machst du nicht einfach "push(@d, $daten)". Damit sparst du dir die Laufvariable.
return (@d,@c);
»» }
($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!
Wenn ich keinen Denkfehler mache, gibst du aus der Funktion 2 Arrays zurück, schreibst diese aber in
Skalare. D.h. in $aufdaten steht das erste Element von @d und in $b das zweite Element von @d. Ich nehme
an, daß du @d im Unterprogramm in ein Array @aufdaten im Hauptprogramm speichern willst. Entsprechend
@c im Unterprogramm nach @b im Hauptprogramm. Das geht so leider nicht, da @aufdaten sämtliche
Array-Elemente "aufsaugt", die du mit return zurückgibst. In @aufdaten würden also sowohl die Elemente von
@d, als auch die Elemente von @c stehen. Direkt hintereinander. @b wäre leer.
Die Methode, die du zur Rückgabe der beiden Arrays verwenden willst, funktioniert so also leider nicht.
Aber eigentlich mußt du auch nicht die gesamten Arrays zurückgeben. Es reicht, wenn du Referenzen auf
beide Arrays zurückgibst. Anders als in anderen Programmiersprachen, bleiben die lokal angelegten Arrays
nämlich auch nach Beenden der Subroutine erhalten, solange eine Referenz existiert. Du kannst also im
Hauptprogramm "normal" darauf zugreifen und z.B. umkopieren.
Ich hoffe dir soweit geholfen zu haben. (und vor allem die gewollte Funktionsweise verstanden zu haben :-))
Gruß,
Slyh
Hallo,
Wie kann man zwei Variablen von einem Unterprogramm übernehmen??
Das funktioniert nicht!
sub Datenaufbereitung
»» {
local @formularfelder;
local ($name, $daten, $input);$input = $_[0];
@formularfelder = split(/&/, $input);foreach $feld (@formularfelder)
{
($name, $daten) = split(/=/, $feld);
$daten =~ s/+/ /go;
$daten =~ s/%(..)/pack("C", hex($1))/eg;
@d[$i] = $daten;
@c[$i] = $name;
$i = $i + 1;
}return (@d,@c);
»» }
($aufdaten,$b)=&Datenaufbereitung($daten); # 2 Variablen!
Danke
Grundsätzlich können Funktionen in Perl Listen von Werten zurückliefern:
sub wasauchimmer
{
return (1,2,3);
}
($a,$b,$c) = &wasauchimmer;
print "$a,$b,$c";
liefert das erwartete Ergebnis. Die Ausgabe ist "1,2,3".
Wunderbar, oder?
Es geht auch so:
sub wasauchimmer
{
my(@array);
$array[0] = 1;
$array[1] = 2;
$array[2] = 3;
return @array;
}
bei der Rückgabe von zwei Arrays funktioniert das gantze nicht mehr, da beide Listen quasi zu einem verschmolzen werden, da Perl nur _eine_ Liste zurückgibt.
Allerdings willst Du ja auch nru, daß die aufrufende Funktion oder das Hauptprogramm eine Zuordnung zwischen den Namen und den Daten hat. Dafür kennt Perl auch die Lösung. Das ganze nennt sich Hash.
sub Datenaufbereitung
{
my (@formularfelder) = split(/&/, $_[0]);
my(%params);
foreach $feld (@formularfelder)
{
my($name, $daten) = split(/=/, $feld);
$daten =~ s/+/ /go;
$daten =~ s/%(..)/pack("C", hex($1))/eg;
$params{$name} = $daten;
}
return(%params);
}
%formulardaten = &Datenaufbereitung($daten);
So. Zugreifen kannst Du dann auf die Werte mit (VORNAME soll hier als einer der Namen genommen werden, die in den forumlarfeldern vorgekommen sind.
print $forumlardaten{VORNAME};
Ich hoffe, das ist jetzt auch geklärt.
Und nun zum letzten. ICh denke, das was dieser Code macht, ist Formulardaten aus einem HTML-Formular für die weitere Bearbeitung aufzubereiten.
Aber dafür gibt es ein weltweit unzählige Male eingesetztes Modul zu Perl: CGI.pm
Dasa erledigt das ganze für dich und bietet noch unheimlich viel nützliches.
Also:
perldoc CGI
und staunen. Das hat alles schon jemand für Dich ausprogrammiert, ist normalerweise schon auf Deiner Festplatte und wartet geduldi, daß Du es benutzt.
Schönes Wochenende noch
Klaus