Hej!
Har gjort en gästbok, och skulle nu vilja ha några kommentarer på koden.
Man fyller i namn, stad, e-post och kommentar, samt väljer en passande ikon till det inlägg man skrivit.
Koden har även en lite censurfunktion inbygd som tar bort olämpliga ord som hämtas ur en textfil.
I en annan funktion hämtas dagens datum, som även de lagras för respektive inlägg. Antalet besökare på sidan, och antalet inlägg registreras och presenteras längst ned på sidan.
De 10 senaste inläggen visas. Vill man se de övriga så hänvisas man till en arkiv och söksida (ett annat pl-script).
Tycker att scriptet/gästboken i sig fungerar utmärkt.
Vet att det är svårt att läsas annans kod, men undrar ändå över en fråga. Hur pass bra kvalite är det på kodandet?
Vad kan göras bättre? Vad är direkt fel? Kan man visa denna kod för en van perl-programmerar, utan att behöva skämmas osv?
Bara några funderingar, liksom.
//Demo
#!/usr/bin/perl
# Sökvägen där ikonbilderna ligger, exempelvis...
$bilder='http://www.mindomän.nu';
# Sökvägen till loggan, exempelvis...
$loggan='http://www.mindomän.nu/bok.jpg';
# Sökvägen till söksidan, exempelvis...
$sokning='http://www.mindomän.nu/cgi-bin/boksok.pl';
# Sökvägen till gästboksfilen
$boktext='bok.txt';
# Sökvägen till din gästbok, exempelvis...
$gastbok='http://www.mindomän.nu/cgi-bin/bok.pl';
# Sökvägen till din boknr.txt
$boknr='boknr.txt';
# Sökvägen till cencurfilen, ord.txt
$ord='censur.txt';
################################################
# Kontrollerar om något är ifyllt i formuläret #
################################################
################################################
###### Tar emot uppgifter från formuläret ######
################################################
$forminfo=$ENV{'QUERY_STRING'};
$forminfo=~tr/+/ /;
$forminfo=~s/%(..)/pack("c",hex($1))/ge;
@par=split(/&/,$forminfo);
foreach $a (@par){
($ruta, $text)=split(/=/,$a);
$INFO{$ruta}=$text;
}
####################################################################################
###### Kontrollerar om något fält är ifyllt ######
###### Om ja, gå till subrutinen för att ta emot värden ######
###### Om nej, går då till subrutinen för att skriva ut listan och formuläret ######
####################################################################################
if($INFO{'namn'} ne "" || $INFO{'epost'} ne "" || $INFO{'hemstad'} ne "" || $INFO{'kommentar'} ne ""){
®istrera_kommentar;
}
else
{
&skriva_gastlista;
}
#############################################
# Subrutin som skriver ut gästbokens inlägg #
#############################################
#########################
# SKRIVER UT HTML-SIDAN #
#########################
print "Content-type: text/html\n\n";
print "<html><head><title>Gästbok 1.0</title></head>";
print "<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0000FF\" vlink=\"#0000FF\">";
print "<center><img src=$loggan></center><center><small><br>";
print "<b>På denna sida finner du de 10 senaste inläggen.<BR>";
print "Vill du se eller söka bland de övriga inläggen<br>";
print "hänvisar vi till vår <a href=\"$sokning\">arkiv och söksida</A>.";
print "<b><br></center></small>";
print "<STYLE>A {text-decoration:none} A:hover{text-decoration:underline} </STYLE></p>";
print "<div align=\"center\"><center><table border=\"0\" width=\"400\"> <tr>";
print "<td width=\"100%\"><p align=\"center\"></p> </td> </tr></table></center></div>";
print "<form action=\"/cgi-bin/bok.pl\" method=\"get\">";
print "<div align=\"center\"><center><table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
print "<tr><td align=\"right\"><font color=\"#000000\">";
print "<strong>Namn:</strong></font></td>";
print "<td><input type=\"text\" size=\"30\" maxlength=\"40\" name=\"namn\"></td>";
print "</tr><tr><td align=\"right\"><p align=\"right\"><font color=\"#000000\"><strong>E-post: </strong></font></p>";
print "</td><td><input type=\"text\" size=\"30\" maxlength=\"40\" name=\"epost\"></td>";
print "</tr><tr><td align=\"right\"><p align=\"right\"><font color=\"#000000\"><strong>Hemstad: </strong></font></p>";
print "</td><td><input type=\"text\" size=\"30\" maxlength=\"40\" name=\"hemstad\"></td></tr><tr><td align=\"right\" valign=\"top\">";
print "<p align=\"center\"><font color=\"#000000\"><strong>Kommentar:</strong></font></p></td><td valign=\"top\"><p align=\"right\">";
print "<textarea name=\"kommentar\" rows=\"4\" cols=\"30\" maxlength=\"100\"></textarea><br>";
print "<input type=\"submit\" value=\"Sänd\"> <input type=\"reset\" value=\"Rensa\"></p></td></tr><tr><td>";
print "<p align=\"right\"><font color=\"#000000\"><strong>Figur:</strong></font></p></td><td>";
print "<input type=\"radio\" checked name=\"R1\" value=\"5.gif\"><img src=$bilder\/5.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"2.gif\"><img src=$bilder\/2.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"3.gif\"> <img src=$bilder\/3.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"4.gif\"><img src=$bilder\/4.gif>";
print "<input type=\"radio\" name=\"R1\" value=\"7.gif\"><img src=$bilder\/7.gif>";
print "</td></tr></table></center></div></form>";
print "</body></html>";
sub skriva_gastlista{
$k=0;
open (TEXT,"$boktext");
while ($rad=<TEXT> ){
$k++;
$rad=~/(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)/;
$INFO1[$k]=$1;
$INFO2[$k]=$2;
$INFO3[$k]=$3;
$INFO4[$k]=$4;
$INFO5[$k]=$5;
$INFO6[$k]=$6;
$INFO7[$k]=$7;
$INFO8[$k]=$8;
}
close (TEXT);
}
################################################################################
###### Kontollerar antalet inlägg/rader i textfilen (om de är mindre än 10) ####
################################################################################
open (TEXT,"$boktext");
$kommentarer=0;
@filen=<TEXT>;
foreach $rad (@filen){
$kommentarer++;
}
close (TEXT);
######################################################################
###### Vänder på vektorn så att vekt(1) blir det senaste inlägget ####
######################################################################
$nr=0;
while ($k ne 0){
$SORT1[$nr]=$INFO1[$k];
$SORT2[$nr]=$INFO2[$k];
$SORT3[$nr]=$INFO3[$k];
$SORT4[$nr]=$INFO4[$k];
$SORT5[$nr]=$INFO5[$k];
$SORT6[$nr]=$INFO6[$k];
$SORT7[$nr]=$INFO7[$k];
$SORT8[$nr]=$INFO8[$k];
$nr++;
$k--;
}
#############################################
###### Skriver ut de 10 senaste inläggen ####
#############################################
print "<center><table border=\"0\" width=\"400\"><TR><TD>";
$nr=0;
while ($nr ne 10){
###########################################################################
# Om antalet inlägg är mindre än tio, skall endast de inläggen skrivas ut #
###########################################################################
if($nr eq $kommentarer){
&raknare;
exit;
}
print "<hr>";
print "<img src=\"$bilder/$SORT6[$nr]\" alt=\"Smiley\"> ";
if($SORT3[$nr] ne "tomt")
{
print "<b><a href=\"mailto:$SORT3[$nr]\">$SORT2[$nr]</A></b> <small><i> ($SORT7[$nr])</i> <br>\n";
}
else
{
print "<b>$SORT2[$nr]</b> <small><i>($SORT7[$nr])</i><br>\n";
}
print "$SORT5[$nr]</b><p>\n";
if($SORT4[$nr] ne "")
{
print "$SORT4[$nr], $SORT8[$nr] - $SORT1[$nr]</small><br>";
}
else
{
print "$SORT8[$nr] - $SORT1[$nr]</small><br>";
}
$nr++;
if($nr eq 10){
&raknare;
exit;
}
}
sub raknare{
##################################################
# Räknar fram antalet besökare och lägger till 1 #
##################################################
# Öppnar textfilen för att hämta och ladda om värden
open (RAKNARE,"$boknr");
while ($rad=<RAKNARE> ){
$rad=~/(.*)::(.*)/;
$besokare[1]=$1;
$kommentar[1]=$2;
}
close (RAKNARE);
$besokare[1]++;
open (RAKNARE,">$boknr");
print RAKNARE "$besokare[1]::$kommentar[1]";
close (RAKNARE);
print "<hr><p><small><center>Antalet kommentarer i gästboken är <b>$kommentarer</b> st.<br>Du är besökare nr: <b>$besokare[1]</b> som välkomnas till denna gästbok!";
print "<p><i>Detta gästboksscript är konstruerat<br>av ";
print "<a href=\"mailto:mitt\@epost.com\">mitt namn</a>.</CENTER></SMALL></td></tr></table>";
exit;
}
###################################
# Subrutin som registrerar inlägg #
###################################
sub registrera_kommentar{
################################################################
###### Kontrollerar att obligatoriska uppgifter är ifyllda #####
################################################################
if($INFO{'namn'} eq "" ||$INFO{'kommentar'} eq "")
{
print "Content-type: text/html\n\n";
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Namn och kommentar är obligatoriska uppgifter!<br>";
print "Backa med din browser och fyll i glömd uppgift!";
print "</left></h3></b>";
exit;
}
#######################################################################
###### Kontrollerar att epostuppgifterna innehåller korrekta tecken ###
#######################################################################
if($INFO{'epost'}=~/[;<>\*\`&\$!#\(\)\[\]\{\}:'"]/)
{
print "Content-type: text/html\n\n";
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Din epost innehåller ett felaktigt tecken!<br>";
print "Backa med din browser och korrigera uppgiften!";
print "</left></h3></b>";
exit;
}
if($INFO{'epost'} eq "")
{
$INFO{'epost'}="tomt";
}
####################################################################
###### Skriver ut ett meddelande om att inlägget är registrerat ####
####################################################################
print "Content-type: text/html\n\n";
print "<meta http-equiv=\"Refresh\" content=\"2; URL=$gastbok\">";
print "<body bgcolor=\"white\" text=\"black\">";
print "<p><left><b><h3>";
print "Tack för din kommentar, $INFO{'namn'}!<br>";
print "Du kommer inom kort att förflyttas till gästboken.<br>Om ditt inlägg inte syns, så uppdatera sidan.";
print "</left></h3></b>";
################################
###### Tar bort HTML-taggar ####
################################
$INFO{'namn'} =~ s/</\<\;/g;
$INFO{'namn'} =~ s/</\>\;/g;
$INFO{'hemstad'} =~ s/</\<\;/g;
$INFO{'hemstad'} =~ s/</\>\;/g;
$INFO{'kommentar'} =~ s/</\<\;/g;
$INFO{'kommentar'} =~ s/</\>\;/g;
##########################################
##### Ersätter radbrytningar med <br> ####
##########################################
$INFO{'kommentar'}=~s/\n/<br>/g;
##############################
### Tar fram dagens datum ####
##############################
@dagar = ("Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag");
@manader = ("Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December");
@tid = localtime(time);
if ($tid[3] > 2){
$tid[3] = $tid[3].":e";
}else{
$tid[3] = $tid[3].":a";
}
if ($tid[0] < 10){
$tid[0] = "0".$tid[0];
}
if ($tid[1] < 10){
$tid[1] = "0".$tid[1];
}
if ($tid[2] < 10){
$tid[1] = "0".$tid[1];
}
$tid[5]=$tid[5]+1900;
$datum= "$dagar[$tid[6]]en den $tid[3] $manader[$tid[4]] $tid[5]";
#############################################################
# Går igenom censurfilen och ersätter olämpliga ord med *** #
#############################################################
open(FILE,"$ord");
@censur=<FILE>;
close FILE;
map {
chomp;
$replace = '*' x length($_);
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'epost'} =~ s/$_/$replace/gi;
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'hemstad'} =~ s/$_/$replace/gi;
$INFO{'kommentar'} =~ s/$_/$replace/gi;
}
@censur;
############################################################
# Kontrolelrar så att inget skrivit :: och förstör filerna #
############################################################
@kontroll = ('::');
map {
$replace = '*' x length($_); # Här är det du söker.
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'epost'} =~ s/$_/$replace/gi;
$INFO{'namn'} =~ s/$_/$replace/gi;
$INFO{'hemstad'} =~ s/$_/$replace/gi;
$INFO{'kommentar'} =~ s/$_/$replace/gi;
}
@kontroll;
#####################################################
### Tar fram numret på inlägget, samt ökar med 1 ####
#####################################################
open (RAKNARE,"$boknr");
while ($rad=<RAKNARE> ){
$rad=~/(.*)::(.*)/;
$besokare[1]=$1;
$kommentar[1]=$2;
}
close (RAKNARE);
$kommentar[1]++;
open (RAKNARE,">$boknr");
print RAKNARE "$besokare[1]::$kommentar[1]";
close (RAKNARE);
###########################
### Sparar variablerna ####
###########################
open (LOGG,">>$boktext");
print LOGG "$kommentar[1]::$INFO{'namn'}::$INFO{'epost'}::$INFO{'hemstad'}::$INFO{'kommentar'}::$INFO{'R1'}::$ENV{'REMOTE_ADDR'}::$datum\n";
close (LOGG);
exit;
}
------------------
"De som styr vårt land - är överklassens rövarband."
[Redigerat av demo den 06 nov 2000]