Hallo Martin,
Nachdem Du die bereits gemachte Vorschläge berücksichtigt hast, versuch ich mich mal in einer Fehlersuche, damit auch ein Lerneffekt eintritt.
[...]
%daten = &CGIDA ($daten);
Hier erwartest Du eine Hash als Rückgabewert (komme später darauf zurück ;-)).
$name = "test".".dat";
^.....(1)
Die Maskierungen(1) ist hier überflüssig. In Strings musst Du nur Sonderzeichen maskieren, die in einer mit "" eingefassten Zeichenkette eine Sonderbedeutung haben ($@% als Variablenkennzeichner " als Stringterminator,\ als Escaper )
Du kannst also ruhig $name = "test.dat" schreiben.
[...]
open DATEN, ">>$verz$name";
while ( ($temp, $wert) = each %daten)
{
print "$wert";
^.....(2)
$temp = 0
^.....fehlendes Semikolon (testest Du eigentlich Dein Skripts mit perl -cw skript.pl ?)
}
close DATEN;
Wenn Du in die geöffnete Datei schreiben willst, musst Du auch der print-Anweisung(2) mitteilen worein sie schreiben soll. Im Moment schreibst Du auf <STDOUT>. Gib bei (2) DATEN als Dateihandle an und schon landen die Daten eben dort.
Zudem musst Du Variablen nicht in Anführungszeichen setzen, wenn Du sie ausgeben willst, da das nur "Zeit kostet" (macht sich wahrscheinlich bei so kleinen Skripts nicht sonderlich bemerkbar). Perl muss nämlich erst den String parsen um die Variable durch eine Wert zu ersetzen (wenn ich mich nicht täusche, und das im Forum aufgeschnappte Wissen ausreichend ist ;-)
sub CGIDA {
[...]
local %cgihash;
^......(3)
Imho ist 'my' das was Du hier (3) brauchst, um eine Variable lokal zu machen ;-)
[...]
return $cgihash
} ^...(4) ^.....fehlendes Semikolon
Du übergibst einen leeren Skalar (4), und nicht den/dem/das Hash, den Du erstellt hast (siehe oben).
[...]
hoffe jemand kann mir helfen,thx.
Hoffentlich hilft Dir das weiter. Aber in Zukunft solltest Du Deine Skripte erst mal vom Perl-Interpreter checken lassen:
perl -cw myskript.pl
damit hättest Du schon mal Fehlermeldungen erhalten, die Dich auf wichtige Stellen stoßen.
Außerdem ist use strict; auch nicht schlecht, da es bei Ungereimtheiten mit Variablen eine Meldung ausstößt. Das erfordert allerdings das explizite Deklarieren von Variablem mit 'my'.
Gruß AlexBausW
P.S.: Ich hoffe keinen größeren Fehler übersehen zu haben. Die logischen Fehler bzw. die Ablaufsteuerung musst Du selbst noch mal durchdenken.