Split mit verschachtelten handles

hallo zusammen!
ich hätte da mal wieder zwei anfängerfragen. für geübte sicher kurz (sieht länger aus, als es ist)- es geht wohl um’s grundverständnis der ablauforganisation. hab’s erstmal spontan runtergeschrieben und läuft natürlich nicht so, wie ich mir das dachte. was ich also machen will:

mein (perl) cgi-script sollte

  1. daten aus einem web-formular in ein flat-file schreiben.
  2. die zeilen dieses files umsortieren und
  3. diese sortierten zeilen splitten und die variablen in einem html-file fest abspeichern (also nicht nur an den screen/browser ausgeben).

so- mit punkt 1 gibt’s keine probs. ich spar mir auch mal die formalitäten und gehe gleich zum kern:

#zeilenfolge umkehren

open (Umk, „…/bernds/test.txt“);
@gesamt=;
@umgek=reverse @gesamt;
#hier wär schon die frage, ob das handle nun JETZT zu schließen wäre

#html-file produzieren

open (TST, „>…bernds/webseite.html“);

print TST „Content-Type: text/html\n\n“;
print TST (…)
headerbody1

#hier ist der wurm drin
(da zugriff auf „umgekehrtes“ array nach schreiben in zweite datei):

while ($umgek=)
{
@zeile=split(/\t/, $umgek);
$erstens=$zeile[0];
$zweitens=$zeile[1];
$drittens=$zeile[2];

print TST
ende

close TST;

yo- falls das hilft: der „dzsoft perl editor“ hätte nun gern eingangs der while-schleife für das "global symbol ‚$umgek’ " einen „explicit package name“ (online im cgi-bin gibts nur den üblichen „compilation error“ als meldung)

meine 2 fragen dazu:
problematisch ist offensichtlich der zugriff auf „@umgek“- trotzdem sehe ich das doch richtig, dass die variablen eines arrays den namen desselben tragen müssen?
oder ist es nicht zulässig, die handles so zu verschachteln?

wäre für einen tipp echt dankbar.

greetings
bernd

Fehlerhandling fehlt

open (Umk, „…/bernds/test.txt“);
@gesamt=;
@umgek=reverse @gesamt;

besser:

open (UMK, "
close UMK;

#hier wär schon die frage, ob das handle nun JETZT zu
schließen wäre

eigentlich ja, da Du es icht mehr wirklich brauchst oder?

Also: close Umk;

Nebenbei: Filehandles werden grundsätzlich aus Konvention in Grossbuchstaben geschrieben - also so: UMK

#html-file produzieren

Fehlerhandling fehlt s.o.

open (TST, „>…bernds/webseite.html“);

print TST „Content-Type: text/html\n\n“;
print TST (…)
headerbody1

#hier ist der wurm drin
(da zugriff auf „umgekehrtes“ array nach schreiben in zweite
datei):

while ($umgek=)
{
@zeile=split(/\t/, $umgek);

Sollte das nicht so lauten?

oder wieso hast Du die Werte zuerst umsortiert?

while (@umgek) {
@zeile=split(/\t/, $_);

$erstens=$zeile[0];
$zweitens=$zeile[1];
$drittens=$zeile[2];

print TST
ende

close TST;

meine 2 fragen dazu:
problematisch ist offensichtlich der zugriff auf „@umgek“-

nein - siehe Kommentare im Quelltext

trotzdem sehe ich das doch richtig, dass die variablen eines
arrays den namen desselben tragen müssen?

??? Die Frage ist unverständlich

oder ist es nicht zulässig, die handles so zu verschachteln?

Handles können „verschachtelt“ werden

spässken :wink:
hallo klaus,
dank erstmal für die antwort- 50% meiner unklarheiten sind damit auch erledigt.

Fehlerhandling fehlt

klar- darauf verzichte ich erstmal, weil ich den code so besser lesen/verstehen kann (solange ich mir damit im zweifelsfall höchstens selbst auf die nerven falle…)

eigentlich ja, da Du es icht mehr wirklich brauchst oder?

vielleicht eher nein :wink: s.u.

while ($umgek=)
{
@zeile=split(/\t/, $umgek);

Sollte das nicht so lauten?

ich möchte das umsortierte array zeilenweise auslesen.

oder wieso hast Du die Werte zuerst umsortiert?

while (@umgek) {
@zeile=split(/\t/, $_);

dies ist nun so ein lustiges endlosschleifchen geworden (hat den server ganz schön ins schwitzen gebracht *ggg*)
wie gesagt: das umgekehrte array zeilenweise abarbeiten, meine schlauen (??) bücher sagen mir, dass man sowas mit diesem operator erreicht.
wenn ich nun aber an dieses konstrukt das file-handle ()ranhänge, gibts den „error 500“
auf dieses problem bezog sich meine frage:

trotzdem sehe ich das doch richtig, dass die variablen eines
arrays den namen desselben tragen müssen?

in @umgek befinden sich die zeilen des flat-files als variablen (die ich dann zu splitten trachte) und nach meinem bisherigen kenntnissstand müssten diese dann einzeln entsprechend „$umgek“ lauten?
sowas gibt aber hier wieder fehlermeldungen.
(allerdings besser als den schwachbrüstigen billig-server ins nirvana zu schicken *g*)
fällt dir noch was ein dazu?

greetings
bernd

ich möchte das umsortierte array zeilenweise auslesen.

dies ist nun so ein lustiges endlosschleifchen geworden (hat
den server ganz schön ins schwitzen gebracht *ggg*)
wie gesagt: das umgekehrte array zeilenweise abarbeiten, meine
schlauen (??) bücher sagen mir, dass man sowas mit diesem
operator erreicht.

Das würde mich eher wundern. Aber Du hast Recht - ich habe Dir unbeabsichtigt eine Endlosschleife untergeschoben - sorry
Es müßte lauten:

foreach (@umgek) {
@zeile=split(/\t/, $_);

oder mit „Laufvariable“:
foreach $line (@umgek) {
@zeile=split(/\t/, $line);

andere Alternative (direkt aus dem File in umgkehrter Reihenfolge lesen

foreach (reverse ) {
@zeile=split(/\t/, $_);

oder wenn Du unbedingt auf die Variable $umgek bestehst:

foreach my $umgek (reverse ) {
@zeile=split(/\t/, $umgek);

Der Name der Variablen ist dabei egal.
siehe perldoc -f foreach

wenn ich nun aber an dieses konstrukt das file-handle
()ranhänge, gibts den „error 500“
auf dieses problem bezog sich meine frage:

trotzdem sehe ich das doch richtig, dass die variablen eines
arrays den namen desselben tragen müssen?

in @umgek befinden sich die zeilen des flat-files als
variablen (die ich dann zu splitten trachte) und nach meinem
bisherigen kenntnissstand müssten diese dann einzeln
entsprechend „$umgek“ lauten?

Nein - der Name ist egal. Es ist eine Zuweisung an eine „Laufvariable“. Eigentlöich aber unnötig, da „foreach“ die Werte automatish der Variable $_ zuweist. (s.o.)

Klaus

tja: error 500
moin klaus,
das ist die schlechte nachricht: so, wie du zuletzt sagtest geht es tatsächlich immer noch nicht. habe das ganze einer längeren versuchsreihe unterzogen (sprich: in die einzelteile zerlegt) und kann soviel sagen: mit der foreach/while-schleife hat das nur in zweiter linie zu tun- das hauptprob liegt daran, dass das „reverse“ so nicht klappt (schätze, das führt in die untiefen von skalar- und listen-kontext…). DAS habe ich so noch nicht gelöst- sondern mich einfach drum gedrückt. die gute nachricht ist nämlich: habe die umgekehrte ausgabe trotzdem geschafft- via „pop“ in der schleife.
mal wieder ganz einfach…
… und poppen ist nie verkehrt (;o)

THX anyway
bernd