Code des Wahnsinns *g*
Aqua
- perl
0 Sven Rautenberg0 Struppi0 Helmut Weber0 TorstenA0 Struppi0 TorstenA
0 Helmut Weber
0 Struppi
Hallo!
Multiples SELECT-Feld (Strg),
user selectiert mehrer eintries,
sendet,
und dann wird nach dem senden angezeigt was
er selectiert hat,
aber wieder in der Select-Box.
Das ganze geht mit dem Befehl "map" recht gut,
aber mit "map" stehe ich auf Kriegsfuß,
und will ihn auch daher nicht verwenden.
Und dieses Code hier nenne ich "Code des Wahnsinns"
weil er nicht nur chaotisch ist,
sondern nichtmal funktioniert (grummel)
Wenn wer ne geniale idee hat wie man das lösen kann,
aber bitteschön ohne "map" waere es toll.
LG
Aqua
======================================================
#!/usr/bin/perl
use CGI;
use strict;
my $cgi=CGI->new();
my @all=qw(Pear Banana Peach Cherry Orange Coconut Apple Nut Chocolate Burger Bread Grapefruit);
my @selected = $cgi->param("food");
print "Content-type: text/html\n\n";
print <<'EOF';
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
</head>
<body>
EOF
print '<form action="foo.pl" method="post">';
print '<div>';
print '<select name="food" size="5" multiple>';
my $a;
my $b;
my $c;
my $d;
if($cgi->param("foodform") eq "submit")
{
for(@all)
{
$a=$_;
for(@selected)
{
$b=$_;
if($a eq $b)
{
$c = "1";
}
else
{
$c = "0";
}
}
if($c==1)
{
$d.='<option value="'.$a.'" selected>'.$a.'</option>';
}
else
{
$d.='<option value="'.$a.'">'.$a.'</option>';
}
print $d;
}
}
else
{
for(@all)
{
print '<option value="'.$_.'">'.$_.'</option>';
}
}
print <<'EOF';
</select>
<br>
<input type="submit" value="submit" name="foodform">
</div>
</form>
</body>
</html>
EOF
======================================================
Moin!
Das ganze geht mit dem Befehl "map" recht gut,
aber mit "map" stehe ich auf Kriegsfuß,
und will ihn auch daher nicht verwenden.
Ich hab mir dessen Beschreibung in Perldoc angesehen und glaube nicht, dass du ihn hier verwenden willst. Ich würde es nicht wollen.
Und dieses Code hier nenne ich "Code des Wahnsinns"
weil er nicht nur chaotisch ist,
sondern nichtmal funktioniert (grummel)
Dein Ansatz ist auch nicht sonderlich ideal.
Ich fasse zusammen: Du hast eine Liste von Elementen, die deine Select-Liste bilden. Du hast weiterhin eine Liste von Elementen, die als Bestandteil dieser Liste ausgewählt wurden - also eine echte Teilmenge davon.
Du willst jetzt basierend auf der Information, ob ein Element der Gesamtliste auch Element der Teilmenge ist, zwei verschiedene HTML-Codes zur Wiedergabe der Liste ausgeben.
Mein Ansatz: Statt ständig in der Teilmenge nachzukramen, ob das aktuelle Element der Gesamtliste enthalten ist, solltest du dir lieber zwei Schleifen machen, die jeweils beide Listen genau EINMAL durchlaufen und am Ende die Information, ob ein Element Bestandteil der Teilmenge war oder nicht, als Wert in einer Variablen ablegt.
Strategie: Lege die Gesamtliste als Hash ab. Dann kannst du zu jedem Schlüssel (dieser ist das Element, was in der Liste erscheint) noch einen Extrawert einfügen, nämlich, ob das Element in der Teilmenge enthalten ist oder nicht.
Also einmal eine Schleife durchführen, um aus @array ein %hash zu machen, wobei gilt: Jedes Element $array wird zu einem Element $hash[$array] mit Initialwert 0.
Dann wird einmal die Schleife für die Teilmenge durchlaufen. Wieder das gleiche Spiel: @teilmenge wird in %hash eingefügt, diesmal gilt= $hash[$teilmenge]=1.
Mit dieser Information kannst du dann wahlweise direkt den Hash anzapfen und dessen Keys als Ausgabeinformation nehmen (sinnvollerwiese sortiert nach Alphabet, und nicht "zufällig", wie bei Hashes üblich), oder du kannst zumindest in _einer_ Schleife das gesamte @array ausgeben und den Status "ist in Teilmenge" währenddessen aus dem Hash abfragen.
Wenn wer ne geniale idee hat wie man das lösen kann,
aber bitteschön ohne "map" waere es toll.
Ist ohne Map - aber auch sonst ohne Code. In Perl hab ich zu lange nichts mehr geschrieben.
- Sven Rautenberg
#!/usr/bin/perl
use CGI;
use strict;my $cgi=CGI->new();
soweit so gut, aber warum du ein über 200KB grosses Modul einbindest, um dann lediglich eine einzige Funktion zu nutzen ist mir ein Rätsel.
my @all=qw(Pear Banana Peach Cherry Orange Coconut Apple Nut Chocolate Burger Bread Grapefruit);
my @selected = $cgi->param("food");print "Content-type: text/html\n\n";
print $cgi->header() . $cgi->start_html(-title => '', .....);
print $cgi->start_form(....)
. $cgi->scrolling_list(
-name=>'food',
-values=> @all,
-default=>[],
-size=>5,
-multiple=>'true',
)
. $cgi->submit(-name => 'foodform')
. $cgi->end_form()
;
....
ungetestet
Les dir mal die Doku zum CGI Modul durch. Es sollten so alle bereits gewählten elemente angewählt bleiben.
Struppi.
Hallo Struppi,
#!/usr/bin/perl
use CGI;
use strict;my $cgi=CGI->new();
soweit so gut, aber warum du ein über 200KB grosses Modul einbindest, um dann lediglich eine einzige Funktion zu nutzen ist mir ein Rätsel.
Ich habe mir auch schon oft Gedanken gemacht, ob ich nur für den HTTP-Header und die Übergabe-Parameter das ganze CGI-Modul laden, oder diese kleine Aufgaben in ein paar Zeilen Code selbst übernehmen soll.
In der Doku zu dem CGI-Modul habe ich dann jedoch gelesen, das das CGI-Modul per Autoload nur die Funktionen läd, die ich in meinem Skript auch wirklich brauche!
Ist jetzt das benutzen des CGI-Moduls nur für den HTTP-Header und die Übergabe-Parameter (Ausgabe mache ich per HTML::Template) effizient, oder lade ich mir da jedesmal ein Bollwerk in den Speicher, das ich eigentlich gar nicht benötige?
Wie setzt Ihr das CGI-Modul ein (wenn überhaupt)?
Gruß
Helmut Weber
Hallo,
Wie setzt Ihr das CGI-Modul ein (wenn überhaupt)?
Mit vorsichtiger Zurückhaltung, für meine Zwecke ist meist use CGI qw(param); völlig ausreichend. Umfangreiche HTML-Ausgaben realisiere ich mittlerweile - wie du - mit Hilfe des Moduls HTML::Template.
Viele Grüße
Torsten
Mit vorsichtiger Zurückhaltung, für meine Zwecke ist meist use CGI qw(param); völlig ausreichend. Umfangreiche HTML-Ausgaben realisiere ich mittlerweile - wie du - mit Hilfe des Moduls HTML::Template.
was aber gerade für umfangreiche CGI Anwendungen mit Sicherheit umständlicher ist. wie z.b. im Fall von Aqua, du kannst mit dem Modul sehr einfach Formularfelder definieren und vorbelegen, was mit HTML Template nicht geht.
Struppi.
Hallo Struppi,
was aber gerade für umfangreiche CGI Anwendungen mit Sicherheit umständlicher ist.
Das mag sein, allerdings habe ich diese Funktionen des CGI-Moduls noch nicht benötigt, was natürlich ihren Einsatz in meinem Fall keineswegs und absolut ausschließt.
du kannst mit dem Modul sehr einfach Formularfelder definieren und vorbelegen, was mit HTML Template nicht geht.
Wenn ich dich richtig verstanden habe, geht das auch mit HTML::Template, nur eben anders. Ob es mit dem CGI-Modul komfortabler und evtl. besser geht, kann ich nicht beurteilen, da ich die entsprechenden Möglichkeiten bisher noch nicht eingesetzt habe.
Grüße
Torsten
Hallo Torsten,
Mit vorsichtiger Zurückhaltung, für meine Zwecke ist meist use CGI qw(param); völlig ausreichend. Umfangreiche HTML-Ausgaben realisiere ich mittlerweile - wie du - mit Hilfe des Moduls HTML::Template.
use CGI qw(param) hört sich sehr gut an, denn zu mehr benötige ich das Modul wirklich nicht. Den HTTP-Header kann ich auch mit einer simplen print-Anweisung ausgeben.
Struppis Einwand mit dem Erstellen von Forumlaren sollten allerdings auch nicht außer Acht gelassen werden. Wobei für mich allerdings immer noch die Verbindung zwischen dem CGI-Modul und dem HTML::Template-Modul unklar ist. Laut Dokumentation soll es da ja eine Möglichkeit geben, beide Module miteinander zu verbinden. Hat da schon jemand Erfahrungen sammeln können?
Gruß
Helmut Weber
Ist jetzt das benutzen des CGI-Moduls nur für den HTTP-Header und die Übergabe-Parameter (Ausgabe mache ich per HTML::Template) effizient, oder lade ich mir da jedesmal ein Bollwerk in den Speicher, das ich eigentlich gar nicht benötige?
Effizient ist es vermutlich nicht.
Aber es ist schon richtig, daß das Modul mit AUTOLOAD nur die nötigen Funktionen lädt. darüber hinaus ist das Modul auch serverseitig mit Sicherheit im Cache insofern sollte der overhead im Rahmen bleiben (was sind heute schon 200kb).
Wie setzt Ihr das CGI-Modul ein (wenn überhaupt)?
sehr exzessiv. Ich erstelle Formulare, Tabellen und den meisten HTML Code mit den Funktionen aus dem Modul.
Struppi.