Kapitel 5 - Perl

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:

http://www.perl.com


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.