Hallo Leute,
habe ein kleines Problem mit Perl.
Ich soll ein Kontaktformular abändern. Der Kollege, der es damals erstellt hatte, ist nun nicht mehr da. Und da bleibt es an mir hängen. Kenne mich aber nicht so gut aus mit Perl. Hoffe ihr könnt mir helfen.
Und zwar soll anhand der Länderauswahl im Formular der $receiver geändert werden. D.h. wählt jemand USA aus, dann geht die Mail an global@..., bei UK an europe@..., usw. Hatte die Abfrage per if und elsif gemacht. Nur wird dann der $receiver bei der entsprechenden Bedingung nicht geändert, sondern nimmt den ersten Wert der if-Bedingung.
Meine Idee war, dass die Variable ($receiver) entsprechend geändert wird, wenn die bestimmte Bedingung (Länderauswahl) zutrifft.
Hat da jemand eine Idee?
Besten Dank und Grüße
Timo
User since
2003-08-04
14371
Artikel
ModeratorIn
Ohne Code lässt sich nix sagen. Wir sind ja keine Hellseher ;-)
Also das Formular sieht so aus:
<form name="form1" method="post" action="/cgi-bin/contact.pl">
<select name="country">
<option value="usa">Vereinigte Staaten</option>
<option value="uk">Vereinigtes Königreich</option>
</select>
<input type="submit" class="Button" value="Absenden">
</form>
Und die Perl-Datei so:
#!/usr/bin/perl
use DBI;
use CGI qw/:all/;
## Daten einlesen
$country = param('country');
if ($country = "usa") { $receiver ="global\@..."; }
elsif ($country = "uk") { $receiver ="europe\@..."; }
... usw
Im Endeffekt soll einfach dann die Mail an die entsprechende Adresse geschickt werden.
Hoffe ihr könnt damit was anfangen.
User since
2006-02-17
628
Artikel
BenutzerIn
Stringvergleiche gehen in Perl so:
eq = equal
ne = not equal
User since
2003-08-04
12208
Artikel
Admin1
*immer*
use warnings;
use strict;
benutzen.
(
UseStrict)
dann hätte dich perl bei diesem script gewarnt. du schreibst einen vergleich mit einem einzigen
gleichheitszeichen. aber ein einziges gleichheitszeichen ist eine zuweisung? wie soll das
funktionieren? du willst doch nicht zuweisen, sondern vergleichen. was für ein buch nutzt du
zum perl-lernen?
in einem weiteren schritt hätte perl dich dann gewarnt, dass du strings mit == vergleichen willst.
das macht man stattdessen mit 'eq'.
Hab jetzt mal ein wenig rumgespielt. Bekomme mit folgendem Code:
#!/usr/bin/perl -w
use DBI;
use CGI qw/:all/;
use warnings;
use strict;
$country = param('country');
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "<h1>Hurra, es klappt!</h1>\n";
print "</body></html>\n";
einen "Internal Server Error". Sobald ich die Zeile $country = param('country'); lösche, funktioniert es wieder.
User since
2003-08-04
14371
Artikel
ModeratorIn
Du solltest den von pq verlinkten Artikel schon lesen. Dort steht drin, dass man jede Variable deklarieren muss. (hint: "my" löst viele Probleme)
Hallo renee,
danke für den Hinweis. Nur, was ich nicht verstehe, dass in dem Ursprungs-Perlskript nichts von "my" stand. Dort wurden eine ganze Reihe von Parametern deklariert nach diesem Motto: "$country = param('country');", was auch funktioniert hatte.
Jedenfalls sieht mein Code jetzt so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w
use DBI;
use CGI qw/:all/;
use warnings;
use strict;
my $receiver;
my $country = param('country');
if ($country eq "usa") { $receiver ="global\@..."; }
elsif ($country eq "uk") { $receiver ="europe\@..."; }
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "<h1>$receiver</h1>\n";
print "</body></html>\n";
Nur leider erfolgt keine Ausgabe.
User since
2003-08-04
14371
Artikel
ModeratorIn
Die
mys sind erst durch das
use strict zwingend notwendig. Da das Ursprungsskript das nicht verwendet hat, waren die
mys nicht unbedingt notwendig.
Das
use strict sollte in jedem Perl-Programm Pflicht sein, da es viele Fehler verhindert, weil es den Programmierer gleich auf mögliche Fehler hinweist.
Zu Deinem Problem:
Was heißt "es kommt keine Ausgabe"? Kommt ein Fehler oder wird Dein HTML ausgegeben nur zwischen den
<h1></h1> steht nix?
Lass Dir mal zusätzlich zum
$receiver auch mal
$country ausgeben.
$country wird ausgegeben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w
use DBI;
use CGI qw/:all/;
use warnings;
use strict;
my $receiver;
my $country = param('country');
if ($country eq "usa") { $receiver ="global\@..."; }
elsif ($country eq "uk") { $receiver ="europe\@..."; }
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "<h1>$receiver $country</h1>\n";
print "</body></html>\n";