Perl och CGI Innehll Perl intro Perl syntax

  • Slides: 39
Download presentation
Perl och CGI

Perl och CGI

Innehåll • • • Perl intro Perl syntax CGI intro CGI. pm Tillstånd File

Innehåll • • • Perl intro Perl syntax CGI intro CGI. pm Tillstånd File upload E-post Databaser Komma igång

Perl intro • • • Mycket populärt och vanligt för CGI Hög nivå, kompakt,

Perl intro • • • Mycket populärt och vanligt för CGI Hög nivå, kompakt, portabelt, snabbt Lätt att komma igång Bra på sträng- och databashantering Många färdiga program och moduler Skriptspråk som kompileras automatiskt till en form som sedan interpreteras

Perl intro • Lånat många bra idéer från andra språk: – Från UNIX's skalprogram

Perl intro • Lånat många bra idéer från andra språk: – Från UNIX's skalprogram kommer många idéer – Från C kommer syntaxen – Från Lisp kommer stödet för listor som en grundläggande datatyp • Dokumentation: – perldoc perl – perldoc CGI

Perl intro • Man kan utesluta kod och skriva om koden så att den

Perl intro • Man kan utesluta kod och skriva om koden så att den får en egen stil (och blir nästan oförståelig): ($postcode) = ($address =~ /([AZ]{1, 2}d{1, 3}[ t]+d{1, 2}[AZ][A-Z]|[A-Z][t ]+d{5})/);

Perl intro • Exempel: #!/usr/local/bin/perl foreach (keys %ENV) { print "$_: $ENV{$_}n"; } Magiska

Perl intro • Exempel: #!/usr/local/bin/perl foreach (keys %ENV) { print "$_: $ENV{$_}n"; } Magiska raden berättar för UNIX vad som ska användas för att köra resten

Perl intro • Flaggor: – #!/usr/local/bin/perl –w – #!/usr/local/bin/perl –T – Varnar för farlig

Perl intro • Flaggor: – #!/usr/local/bin/perl –w – #!/usr/local/bin/perl –T – Varnar för farlig kod – Alla flaggor: perl -h Brukar inte använda : -)

Perl syntax Variabler/datatyper • Skalärer $x = 5; • Listor @x = (1, 2,

Perl syntax Variabler/datatyper • Skalärer $x = 5; • Listor @x = (1, 2, ’hej’); • Tabeller $x{’y’} = ’z’;

Perl syntax Variabler/datatyper: skalärer • Tal eller strängar • Perl omvandlar automatiskt mellan olika

Perl syntax Variabler/datatyper: skalärer • Tal eller strängar • Perl omvandlar automatiskt mellan olika typer av skalärer • Börjar med $ följt av en engelsk bokstav följt av engelska bokstäver eller siffror eller understrykningstecknet: $x = 1; $x = ”Hejsan”;

Perl syntax Variabler/datatyper: listor • Är en uppräkning (ordnad samling) av skalärer (ej listor

Perl syntax Variabler/datatyper: listor • Är en uppräkning (ordnad samling) av skalärer (ej listor i listor) • Man kommer åt en viss skalär i listan genom att ange dess position, första elementet har position 0 • Börjar med @

Perl syntax Variabler/datatyper: listor @lista 1 = (1, 4, 9, 16, 25, ”Vad kommer

Perl syntax Variabler/datatyper: listor @lista 1 = (1, 4, 9, 16, 25, ”Vad kommer sen? ”); @lista 2 = (); Tomma listan $element = $lista 1[2]; Skalär som har värdet 9 @dellista = @lista 1[1, 3, 4]; Får värdet (4, 16, 25)

Perl syntax Variabler/datatyper: listor $lista 1[1] = 2; Elementet på plats 1 sätts till

Perl syntax Variabler/datatyper: listor $lista 1[1] = 2; Elementet på plats 1 sätts till värde 2 i @lista 1 $lista 1[2, 5, 1] = (1, 2, 3); Betyder: $lista 1[2] = 1, $lista 1[5] = 2, $lista 1[1] = 3 print (10, 20, 30)[1]; Skriver ut 20

Perl syntax Variabler/datatyper: listor ($ett, $två, $tre, $fyra, $fem, $sex) = @lista 1; Betyder

Perl syntax Variabler/datatyper: listor ($ett, $två, $tre, $fyra, $fem, $sex) = @lista 1; Betyder $ett = 1. . . osv ($ett, @två) = @lista 1; Här blir @två resten av listan $length = @lista 1; Ger längden på @lista 1

Perl syntax Variabler/datatyper: tabeller • Fungerar som ordlista där man istället för position använder

Perl syntax Variabler/datatyper: tabeller • Fungerar som ordlista där man istället för position använder ett ord som nyckel • Även här kan man bara lagra skalärer (inte lista eller tabell) • Börjar med %

Perl syntax Variabler/datatyper: tabeller $efternamn{’Kalle’} = ’Anka’; print $efternamn{’Kalle'}; Skriver ut ”Anka” %efternamn =

Perl syntax Variabler/datatyper: tabeller $efternamn{’Kalle’} = ’Anka’; print $efternamn{’Kalle'}; Skriver ut ”Anka” %efternamn = { "Pierre", "Wijkman", "Mirjam", "Häggström” }

Perl syntax Variabler/datatyper: speciella variabler • $_ = variabel som är underförstådd i många

Perl syntax Variabler/datatyper: speciella variabler • $_ = variabel som är underförstådd i många situationer, exempel: – print $_; är samma som print; • @ARGV = lista som innehåller de argument som sändes till programmet vid start från kommandoraden • %ENV = tabell som innehåller programmets omgivningsvariabler

Perl syntax Villkorssatser if (uttryck) { satser } else { satser } sats if

Perl syntax Villkorssatser if (uttryck) { satser } else { satser } sats if uttryck;

Perl syntax Loopar while (uttryck) { satser } sats while uttryck; until (uttryck) {

Perl syntax Loopar while (uttryck) { satser } sats while uttryck; until (uttryck) { satser } sats until uttryck;

Perl syntax Loopar for(startsats; villkor; loopsats) { satser } foreach $element (@lista) { satser

Perl syntax Loopar for(startsats; villkor; loopsats) { satser } foreach $element (@lista) { satser }

Perl syntax Funktioner • Konstruktion: Tar emot argumenten sub x { ($a, $b, $c)

Perl syntax Funktioner • Konstruktion: Tar emot argumenten sub x { ($a, $b, $c) = @_; return $a + $b; } • Anrop: $i = &x(1, 2, 4);

CGI intro • Till Perl finns ett stort antal moduler • Ett Perl-program som

CGI intro • Till Perl finns ett stort antal moduler • Ett Perl-program som ska fungera som CGIprogram måste i huvudsak veta hur det ska: – Sända information till en HTTP-klient – Ta emot information från en HTTP-klient

CGI intro Filrättigheter • • Alla kataloger: chmod 755 i 1 Alla CGI-filer: chmod

CGI intro Filrättigheter • • Alla kataloger: chmod 755 i 1 Alla CGI-filer: chmod 700 1 a. cgi Alla HTML-filer: chmod 744 1 a. html Alla skrivbara filer: chmod 700 1 a_hts • Kör först vid promten, sen med browsern

CGI. pm • CGI. pm är en modul specialiserad mot CGIprogrammering som förenklar utvecklingen

CGI. pm • CGI. pm är en modul specialiserad mot CGIprogrammering som förenklar utvecklingen • Exempel: #!/usr/local/bin/perl use CGI; print header('text/plain'); http: //stein. cshl. org/~lstein/ Man måste ange MIME-type till klienten

I/O Sända information • Allt som skrivs till STDOUT tar HTTPservern emot och sänder

I/O Sända information • Allt som skrivs till STDOUT tar HTTPservern emot och sänder vidare till HTTPklienten • Man måste ange MIME-typ • Normalt lägger sedan HTTP-servern på extra information i HTTP-huvudet (man kan dock instruera HTTP-servern att inte göra detta)

I/O Sända information • Exempel: print $name print header('text/plain'); 'I love Perl!'; = 'Perl';

I/O Sända information • Exempel: print $name print header('text/plain'); 'I love Perl!'; = 'Perl'; "I love $namen"; `dir`;

I/O Ta emot information • Information från HTTP-klienten kan komma: – Inbakat i en

I/O Ta emot information • Information från HTTP-klienten kan komma: – Inbakat i en länk (GET): • http: //www. x. y/z. cgi? id=pw – Från ett HTML-formulär (POST): • <input type=”text” name=”id”/> • Denna info når vi med: $email = param(’id’);

I/O Separera HTML och Perl-kod • Det är viktigt att HTML och Perl-kod är

I/O Separera HTML och Perl-kod • Det är viktigt att HTML och Perl-kod är separata: – Ingen HTML-kod i Perl-kod – Ingen Perl-kod i HTML-kod • HTML- och Perl-kod ska gå att utveckla oberoende av varandra

I/O Separera HTML och Perl-kod • Ett knep är att använda markörer i HTMLkoden

I/O Separera HTML och Perl-kod • Ett knep är att använda markörer i HTMLkoden (---hits---) • Läs in HTML-sidan i Perl-koden och ersätt markören med sitt rätta värde $row =~ s/---x---/$x/; • Skriv ut allt till STDOUT print $row;

I/O Separera HTML och Perl-kod • Har man variabla HTML-strukturer så kan man använda

I/O Separera HTML och Perl-kod • Har man variabla HTML-strukturer så kan man använda HTML-kommentarer runt dessa • Detta markerar ett område som kan användas flera gånger • Man kan även separera data från HTML (se frivilliga uppgifter)

Sessionshantering • Egen sessionshantering eftersom HTTP är inte anslutningsorienterat: – Med omskrivning för länkar

Sessionshantering • Egen sessionshantering eftersom HTTP är inte anslutningsorienterat: – Med omskrivning för länkar och dolda fält – Med kakor som lagras på klienten och sänds i HTTP-huvudet: $c = cookie(-name => $name 1, -value => $value 1, -expires => '+3 h'); print header(-cookie => [$c]);

File upload • Filer från HTTP-klienten till HTTP-servern • HTML-formulär med speciell encoding: <form

File upload • Filer från HTTP-klienten till HTTP-servern • HTML-formulär med speciell encoding: <form method="post" enctype="multipart/form-data" action=”x. cgi"> <input type="file" name=”y" /> • Får ett hantag med: $filehandle = param(’y');

E-post • Sända e-post från CGI är mycket vanligt • Använda de program som

E-post • Sända e-post från CGI är mycket vanligt • Använda de program som finns på serversidan: system('/usr/lib/sendmail -t -oi < message'); Fil meddelandet – Här betyder flaggorna: • -t = brevets mottagare ska anges med ett From: -fält. • -oi = brevet ska avslutas när STDIN stängs (ej. )

Databaser • Data. Base Dependent (DBD) modulen kopplar till databasen, man måste ha en

Databaser • Data. Base Dependent (DBD) modulen kopplar till databasen, man måste ha en speciell för varje typ av databas • Data. Base Independent (DBI) modulen kopplar till Perl programmet, samma för alla databaser Databas DBD DBI Perl

Databaser • Initialisering: use DBI; • Uppkoppling: Databasen är My. SQL och finns på

Databaser • Initialisering: use DBI; • Uppkoppling: Databasen är My. SQL och finns på samma maskin, från en annan maskin: ”DBI: mysql: $db: atlas. dsv. su. se” $dbh = DBI>connect("DBI: mysql: $db", $user, $passwd) or die print "COULD NOT CONNECT: ". DBI->errstr; Handtag till databas Felet från databasen

Databaser • Hämta data: $statement = "SELECT * FROM $table ORDER BY time"; $sth

Databaser • Hämta data: $statement = "SELECT * FROM $table ORDER BY time"; $sth = $dbh->prepare($statement) or die … osv $sth->execute() or die … osv Handtag till statement

Databaser • Hämta data: while(@row = $sth>fetchrow_array) { … osv Hämtar en rad i

Databaser • Hämta data: while(@row = $sth>fetchrow_array) { … osv Hämtar en rad i taget ($id, $time, $name, $email, $homepage, $comment) = @row; Hämtar ut värden ur raden

Komma igång • • • Logga in på Linux-kontot Gå till WWW: cd WWW

Komma igång • • • Logga in på Linux-kontot Gå till WWW: cd WWW Skapa katalog: mkdir ip 2 Chmodda: chmod 755 ip 2 Gå till ip 2: cd ip 2 Starta emacs: emacs first. cgi

Komma igång • Skriv in: #!/usr/local/bin/perl print "Content-Type: text/plainnn"; print "I love Perln"; •

Komma igång • Skriv in: #!/usr/local/bin/perl print "Content-Type: text/plainnn"; print "I love Perln"; • Spara och avsluta emacs • Chmodda: chmod 700 first. cgi • Kör från promten: . /first. cgi

Komma igång • Det skrivs ut: Content-Type: text/plain I love Perl • Starta en

Komma igång • Det skrivs ut: Content-Type: text/plain I love Perl • Starta en browser: netscape http: //atlas. dsv. su. se/~pierr e/ip 2/first. cgi • Det skrivs ut: I love Perl