5.1 Mitt Perlskript fungerar inte, vad är
fel?
Det finns ett par vanliga fel som gör att Perlskripten inte fungera när man försöker
göra dem på Algonet. Det vanligaste felet är att man inte laddat upp skriptet med ASCII
mode i FTP program och således fått med CR tecknet som Windows lägger in. Ett annat fel
är att man inte escapat ett specialtecken. Dessa saker beskrivs i följande avsnitt. Det
finns även andra saker som kan vara fel, och ett bra sätt att få reda på vad som är
fel är att använda Perl interpretatorn med -w flaggan. Då får man
lite mer information om vad som är fel och på vilken rad det är fel. Om man t.ex. har
en fil som heter test.pl som man vill testköra så skriver man:
perl -w test.pl
När man sedan får upp felmeddelandena är det lite enklare att felsöka i skriptet.
Om du har ett CGI skript som du vill testa i drift som strular, så kan du även använda dig av debugversionen av cgiwrap, kallad cgiwrapd. I anropet till cgi.algonet.se så byter du helt enkelt ut cgiwrap mot cgiwrapd så får du mer information om vad som gick fel. Bl.a. så får man se felmeddelandena som Perlskriptet skriver ut (ifall det skriver ut något).
Mer information om felmeddelanden som man kan få från CGI maskinen hittar ni här.
Tack till Oden Eriksson för tipset.
5.2 Escapade tecken, vad är det?
Perl använder vissa specialtecken i språket, och om man vill använda dem i t.ex. en
sträng så måste man escapea dem. Detta gör man genom att sätta ett \ tecken framför
dem. De tecken som man måste escapea om man vill använda dem i en sträng är:
@, $, \, " och %
Detta gäller dock enbart om man använder "" för att omsluta strängen. Om man använder '' så behöver man inte escapea tecknen. Om man använder '' så går det dock inte att stoppa in variabler i strängen, så det är bättre att använda "".
5.3 Sökvägen till Perl
När man jobbar i Unix så kan man använda en specialrad i början av ett skript för att
tala om vilket program som skall startas när man försöker köra skriptet. Denna rad
börjar alltid med #!. Om man har ett Perlskript så skall den första
raden se ut så här:
#!/usr/bin/perl
för att det skall fungera.
5.4 Att ladda upp Perlskript till Algonet
Ett av de vanligaste felen till att Perlskripten inte fungerar när man tankar upp dem
till Algonet är att man använt binary mode i FTP klienten. Se alltså till att alltid
använda ASCII mode när du tankar upp ditt Perlskript, så slipper du de problemen.
Anledningen till att det inte fungerar med binary mode är att (detta gäller endast de
som jobbar på en Windowsplattform) Windows lägger till CR+LF i slutet av varje rad,
medan Unix och många andra plattformar enbart använder LF. Om Perl träffar på ett CR
tecken så tror den att något är fel och skriptet fungerar inte. När man använder
ASCII mode så tas detta CR tecken bort.
5.5 Var kan jag hitta Perl?
Ett bra ställe där man kan hitta Perl för olika plattformar (och en hel del annat
trevligt också) är:
5.6 Sendmail, vad är det, och var finns det?
Sendmail är ett program för att skicka e-post. Det används ofta i Perlskript när man
t.ex. vill skicka ett svarsbrev från skriptet. Sökvägen till sendmail är:
/usr/lib/sendmail
Notera dock att Algonet gjort vissa ändringar, för att förebygga att sendmail kan användas i webbformulär för att skicka spam. För att era skript som använder sendmail skall fungera måste ni använda -f flaggan, och sedan ange er emailadress som avsändare. Här är ett exempel:
/usr/lib/sendmail -f minadress@algonet.se
Om ni använder sendmail i ett Perlskript, och har allting inom " tecken, måste ni ändra @ till \@, eftersom @ är ett specialtecken i Perl, och ert skript kommer inte att fungera om ni inte ändrar det. Här hittar ni mer info om detta, och om ni har problem med era skript finns det lite hjälp på traven här.
5.7 Hur får jag fram sökvägen till mitt
konto?
I vissa skript så behöver man ha den fullständiga sökvägen till sitt konto. Det finns
två sätt att få fram den på. Det ena sättet är att telnetta till någon av Algonets
Unixburkar och när man loggat in skriver man:
pwd
så får man upp sökvägen till sitt konto, i mitt fall /import/user7/. Ibland står det /home/ istället för /import/, men det gör inget, för de pekar på samma ställe (import är en symbolisk länk till home). En annan variant är att skriva:
echo $HOME
eller
printenv HOME
Det andra sättet, och det som är bäst att använda när man skriver t.ex. Perlskript, är att använda följande rad i början av sitt Perlskript:
($name,$passwd,$uid,$gid,$quota,
$comment,$gcos,$dir,$shell)=getpwuid($>);
När man kört den raden kan man sedan använde variabeln $dir för att få fram sin hemkatalog.
5.8 Hello world i Perl
Här är ett exempel på hur man skrivet ett enkelt CGI skript i Perl. Vi kallar det hello.pl.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello world";
Här kan ni själva se resultatet. Här finns källkoden.
5.9 Hur får jag tag i parametrarna
från mitt CGI formulär i Perl?
Här finns ett litet källkodsexempel som visar hur du
gör.
Måns Jonasson har ett annat exempel, som använder CGI modulen till Perl, som kan göra det lite enklare att komma åt parametrarna.
#!/usr/bin/perl
use CGI qw(param);
$namn = param("namn");
$alder = param("alder");
print "Content-type: text/html\n\n";
print "Hej $namn, du är $alder år gammal!\n";
Exemplet ovan läser av namn och alder fälten och skriver ut dem.
5.10 Hur debuggar jag ett Perlskript via webbservern?
Det finns flera sätt. Ett
sätt är att använda cgiwrapd, till skillnad
från cgiwrap, som är en debugversion av cgiwrappern. Den skriver ut
en massa extra information, och gör även det möjligt
att se saker som Perlskriptet skriver ut, men som en
browser inte visar för att man missat att skriva ut
Content-type:.
Ett annat sätt är att lägga till följande rader i början av Perlskriptet. Då syns allting som skriptet skriver ut, även om man kör via cgiwrap.
use CGI qw(:standard);
use CGI::Carp qw/fatalsToBrowser/;
Tack till Måns Jonasson för tipset om CGI modulen.