SCRIPTSPRACHE PERL · Practical Extraction and Report Language p:practical (einfache Programmierung) e:extraction (zieht www- oder System- Datenbank - Information) r:report (Ausgabe von gefundenen Informationen) l:language (Programmiersprache) TETRIS.pl Quelle: O´Reilley´s CD Bookshelf - Entwicklung 1987 von Larry Wall, über 13 Jahre bewährt - Einflüsse: sed, grep, awk, Shell-Skripts und C - generell frei im www verfügbar, Installation , aktuelle version 5.x , Version 6 ist in Entwicklung (evtl. mit deutlichen Änderungen) - ursprünglich als UNIX-Tool, heute auf jedes System übertragbar - per CGI-Programmierung können Formulare und interaktive Eingaben/Abfragen auf den Webserver übertragen werden, sodass Programme bzw. Skripts mit den Daten dort laufen können - Perl ist plattformunabhängig, portabel, besonders gut bei Datenbankkommunikation ANWENDUNG: allround-Skriptsprache für Systemadministration, Webadministration, Programmentwürfe PROGRAMMIERUNG: strukturiert und modular, ~objektorientiert, fortgeschrittene Datenstrukturen möglich DATENTYPEN bezgl. DATENBANKEN: - identifier ($), - arrays (@), - hashes (%) - etc. $aref = \@array; $anon_array = [1, 3, 5, 7, 9]; $anon_copy = [ @array ]; @$implicit_creation = (2, 4, 6, 8, 10); %age = ( "Nat", 24, "Jules", 25, "Josh", 17 ); %food_color = ( Apple => "red", Banana => "yellow", Lemon => "yellow", Carrot => "orange" ); Vorteile von Perl gegenueber PHP: 1. Länger im Geschäft, daher massenweise Module, rel. guter Support, lange getestet, verbreitet. 2. Nicht so sehr auf Web festgelegt. Die Ursprünge liegen in der Textaufbereitung. 3. Andocken an zahlreiche C-Bibliotheken möglich. Das client-server-application-model via CGI Quelle: Learning Pearl ( O´Reilly-Verlag ) „HELLO WORLD“ als Einsteiger-CGI-Programm #!/usr/bin/perl -w # howdy--the easiest of CGI programs print <<END_of_Multiline_Text; Content-type: text/html <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <H1>Greetings, Terrans!</H1> </BODY> </HTML> END_of_Multiline_Text Perl- „Hello_World“: #!/usr/bin/perl -w print ("Hello, world!\n"); Im CGI-Verzeichnis wird ein CGI.Programm abgespeichert, wie bspw. http://www.SOMEWHERE.org /cgi-bin/howdy HTML- Formular eines Perl- guestbooks <HTML><HEAD><TITLE>Guestbook</TITLE></HEAD> <BODY> <H1>Fill in my guestbook!</H1> <FORM METHOD="GET" ACTION="/cgi-bin/guestbook.pl"> <PRE> First Name: <INPUT TYPE="TEXT" NAME="firstname"> Last Name: <INPUT TYPE="TEXT" NAME="lastname"> <INPUT TYPE="SUBMIT"> </FORM> <INPUT TYPE="RESET"> DATENBANK MIT PERL UND SQL 1) SQL Datenbank installieren 2) DBI-Module für Perl laden (www.perl.com , www.symbolstone.org/technology/perl/DBI) ( für WinNT: activestate.com ) gebräuchliche Subroutine ########################################## ## Create a connection to the database. ## ########################################## 1: sub Create_DB_Connection { 2: use DBI; 3: $DSN = "DBI:mysql:$db_name"; 4: $user = "username"; 5: $pw = "secret"; 6: $dbh = DBI->connect($DSN,$user,$pw) 7: || die "Cannot connect: $DBI::errstr\n" unless $dbh; 8: return; 9: } # End of Create_DB_Connection subroutine. ########################################## 1: „beginne Subroutine“ 2: „verwende DBI-Modul“ 3: „Variable heißt DSN - Data Source Name“ „DBI:mysql - Treiber soll verwendet werden“ „Anschluß an Datenbank db_name“ 4: „user/login-name“ 5: „passwort-request“ 6: „nehme Verbindung mit dieser Datenbank auf“ „dbh = DataBaseHandle“ als fester Ausdruck“ 7: „bei Fehlermeldung abbrechen“ 8: „zurück zum eigentlichen Aufruf“ 9: „Ende der Subroutine“ ########################################## ## Executes the SQL command and then ## ## returns to the calling area of the ## ## program. ## ########################################## 1: sub Do_SQL{ 2: eval{ 3: $sth = $dbh->prepare($SQL); 4: }; # End of eval # Check for errors. 5: if($@){ 6: $dbh->disconnect; 7: print "Content-type: text/html\n\n"; 8: print "An ERROR occurred! $@\n"; 9: exit; 10: } else { 11: $sth->execute; 12: } # End of if..else 13: return ($sth); 14:} # End of Do_SQL subroutine ############################################## ################### ## SQL- Ausführung## 1: „beginne Subroutine“ 2: „Vergleichsbedingung eval prüft auf Fehler“ „bei Fehlermeldung wird ein Wert in $@ übergeben“ 3: „checkt DBI auf Fehlerfreiheit- wenn Fehler auftritt, wird er in $@ übergeben“ 4: „beende Evaluierungsblock“ 5ff: „wenn Fehler-Wert in ($@), dann melde ihn und trenne die Verbindung“ „wenn alles okay, dann zum Else-Block“ 7: „HTML-header ausgeben zur Kontrolle“ 8: „Fehlermeldung ausgeben mit dem dem Wert in $@ entsprechenden perlgenerierten Fehlertext“ 10: „wenn fehlerfrei,“ 11: „führe Standart-Handle aus (welches SQL beinhaltet)“ 13: „mit dem $sth-handle zurück zum Programm“ 14: „}“ - Abschluß Beispiel einer Perl-SQL-Datenbank-Implementierung ( Name, e-mail, Tel ) in HTML eingebettet - das search-CGI-Programm gibt angeforderte Daten heraus 1: #!/usr/bin/perl 2: ########################### 3: ## search.cgi ## 4: ## This program grabs ## 5: ## info from a phone ## 6: ## database and prints ## 7: ## if for the user. ## 8: ########################### 9: use CGI qw/:standard/; 10: require "common.sub"; # Contains the "snippets" that we discussed. 11: ## Get the data from the web page. 12: $search_for = param(search_for); 13: $field = param(search_field); 14: $sort = param(sort_on); 15: ## Print the standard HTML header. 16: print header; 17: ## Do our stuff! 18: &Create_DB_Connection; 19: &get_info; 20: &print_results; 21: # Disconnect from the database (DON'T FORGET THIS!) 22: $dbh->disconnect; 23: ################ BEGIN GET INFO SUBROUTINE 24: sub get_info{ 25: ## This is our SQL statement that we want to execute. 26: $SQL="SELECT * FROM phones WHERE $field like '%$search_for%' ORDER BY $sort"; 27: &Do_SQL; 28: } 29: ################ END GET INFO SUBROUTINE 30: ################ BEGIN PRINT RESULTS SUBROUTINE 31: sub print_results{ 32: print <<HTML; 33: <HTML><HEAD><TITLE>Search Thing</TITLE></HEAD> 34: <BODY BGCOLOR="#FFFFFF"> 35: <CENTER><FONT SIZE=6>Search Results</FONT></CENTER> 36: <HR WIDTH=80%> 37: <P> 38: <CENTER><TABLE BORDER=1 CELLSPACING=0> 39: <TR> 40: <TD BGCOLOR="#c0c0c0" COLSPAN=6> 41: <CENTER><B>MySQL/Perl Integration Example</B></CENTER> 42: </TD> 43: </TR> 44: <TR> 45: <TD BGCOLOR="c0c0c0"> 46: <FONT SIZE=2 FACE=ARIAL><CENTER><B>Name</B></CENTER></FONT></TD> 47: <TD BGCOLOR="c0c0c0"> 48: <FONT SIZE=2 FACE=ARIAL><CENTER><B>Phone</B></CENTER></FONT></TD> 49: <TD BGCOLOR="c0c0c0"> 50: <FONT SIZE=2 FACE=ARIAL><CENTER><B>E-Mail</B></CENTER></FONT></TD> 51: <TD BGCOLOR="c0c0c0"> 52: <FONT SIZE=2 FACE=ARIAL><CENTER><B>Notes</B></CENTER></FONT></TD> 53: <TD BGCOLOR="c0c0c0"> 54: <FONT SIZE=2 FACE=ARIAL><CENTER><B>Modify</B></CENTER></FONT></TD> 55: <TD BGCOLOR="c0c0c0"> 56: <FONT SIZE=2 FACE=ARIAL><CENTER><B>Delete</B></CENTER></FONT></TD> 57: </TR> 58: HTML 59: 60: 61: 62: 63: 64: 65: 66: 67: ## fetchrow_hashref grabs the data returned from the SQL call ## and stores them in a hash with the keys being the names ## of the database fields. This is how you access the data. while ($pointer = $sth->fetchrow_hashref){ $f_name = $pointer->{'first_name'}; $l_name = $pointer->{'last_name'}; $phone = $pointer->{'phone'}; $email = $pointer->{'email'}; $notes = $pointer->{'notes'}; 68: ## Make our HTML look better if no data. 69: $f_name = "&nbsp;" if($f_name eq ""); 70: $l_name = "&nbsp;" if($l_name eq ""); 71: $phone = "&nbsp;" if($phone eq ""); 72: $email = "&nbsp;" if($email eq ""); 73: $notes = "&nbsp;" if($notes eq ""); 74: print <<HTML; 75: <TR BGCOLOR="e0e0e0"> 76: <TD><FONT SIZE=2 FACE=ARIAL>$f_name $l_name</FONT></TD> 77: <TD><FONT SIZE=2 FACE=ARIAL>$phone</FONT></TD> 78: <TD><FONT SIZE=2 FACE=ARIAL><A HREF="mailto:$email">$email</A></FONT></TD> 79: <TD><FONT SIZE=2 FACE=ARIAL>$notes</FONT></TD> 80: <TD><FONT SIZE=1 FACE=ARIAL> 81: [<A HREF="/cgi-bin/sql/modify1.cgi?$email">Modify</A>] 82: </FONT><TD> 83: <TD><FONT SIZE=1 FACE=ARIAL> 84: [<A HREF="/cgi-bin/sql/delete.cgi?$email">Delete</A>] 85: </FONT><TD> 86: </TR> 87: HTML 88: } # End of while. 89: print<<HTML; 90: </TABLE></CENTER> 91: <P> 92: <HR WIDTH=80%> 93: <P> 94: <CENTER> 95: <FONT SIZE=4> 96: <A HREF="/sql/index.html">Main Page</A> 97: </FONT> 98: </CENTER> 99: </BODY></HTML> 100: HTML 101: } # End of print_results subroutine 102: ################ END PRINT RESULTS SUBROUTINE add.cgi fügt Daten in die Datenbank ein 1: #!/usr/bin/perl 2: ### add.cgi 3: use CGI qw/:standard/; 4: require "common.sub"; 5: $f_name = &filter(param(first_name)); 6: $l_name = &filter(param(last_name)); 7: $phone = &filter(param(phone)); 8: $email = &filter(param(email)); 9: $notes = &filter(param(notes)); 10: print header; 11: &Create_DB_Connection; 12: &write_data; 13: &print_output; 14: # Disconnect from the database 15: $dbh->disconnect; 16: ################ BEGIN WRITE DATA SUBROUTINE 17: sub write_data{ 18: $SQL = "INSERT INTO phones (first_name,last_name,phone,email,notes) 19: VALUES ('$f_name','$l_name','$phone','$email','$notes')"; 20: &Do_SQL; 21: } # End of write_data 22: ################ END WRITE DATA SUBROUTINE 23: ################ BEGIN PRINT OUTPUT SUBROUTINE 24: sub print_output{ 25: print<<HTML; 26: <HTML><BODY> 27: <CENTER><FONT SIZE=5> 28: Record added to database 29: <P> 30: <A HREF="/sql/index.html">Return to Main Page</A> 31: </P> 32: </FONT></CENTER> 33: </BODY></HTML> 34: HTML 35: } # End of subroutine 36: ################ END PRINT OUTPUT SUBROUTINE delete.cgi löscht Einträge aus der Datenbank 1: #!/usr/bin/perl 2: use CGI qw/:standard/; 3: require "common.sub"; 4: print header; 5: $email = $ENV{QUERY_STRING}; 6: &Create_DB_Connection; 7: &delete_record; 8: &print_results; 9: # Disconnect from the database 10: $dbh->disconnect; 11: ################ BEGIN DELETE RECORD SUBROUTINE 12: sub delete_record{ 13: $SQL="DELETE FROM phones WHERE email = '$email'"; 14: &Do_SQL; 15: } 16: ################ END DELETE RECORD SUBROUTINE 17: ################ BEGIN PRINT RESULTS SUBROUTINE 18: sub print_results{ 19: print <<HTML; 20: <HTML><HEAD><TITLE>Delete Thing</TITLE></HEAD> 21: <BODY BGCOLOR="#FFFFFF"> 22: <CENTER><FONT SIZE=6>Delete Results</FONT></CENTER> 23: <HR WIDTH=80%> 24: <P> 25: <CENTER> 26: <FONT SIZE=6>Record Deleted!</FONT> 27: </CENTER> 28: <P> 29: <HR WIDTH=80%> 30: <P> 31: <CENTER> 32: <FONT SIZE=4> 33: <A HREF="/sql/index.html">Main Page</A> 34: </FONT> 35: </CENTER> 36: </BODY></HTML> 37: HTML 38: # Release the statement handle resources 39: $sth->finish; 40: } # End of print_results subroutine 41: ################ END PRINT RESULTS SUBROUTINE modify.cgi ertsellt ein ausfüllbares HTML-Formular 1: #!/usr/bin/perl 2: ### modify1.cgi 3: use CGI qw/:standard/; 4: require "common.sub"; 5: print header; 6: $email = $ENV{QUERY_STRING}; 7: $saved = $email; 8: &Create_DB_Connection; 9: &get_data; 10: &print_output; 11: # Disconnect from the database 12: $dbh->disconnect; 13: ################ BEGIN GET DATA SUBROUTINE 14: sub get_data{ 15: $SQL="SELECT * FROM phones WHERE email = '$email'"; 16: &Do_SQL; 17: while ($pointer = $sth->fetchrow_hashref){ 18: $f_name = $pointer->{'first_name'}; 19: $l_name = $pointer->{'last_name'}; 20: $phone = $pointer->{'phone'}; 21: $email = $pointer->{'email'}; 22: $notes = $pointer->{'notes'}; 23: } 24: } # End of get_data subroutine. 25: ################ END GET DATA SUBROUTINE 26: ################ BEGIN PRINT OUTPUT SUBROUTINE 27: sub print_output{ 28: print<<HTML; 29: <HTML><HEAD><TITLE>Add Thing</TITLE></HEAD> 30: <BODY BGCOLOR="#FFFFFF"> 31: <FORM ACTION="/cgi-bin/sql/modify2.cgi?$saved" METHOD="Post"> 32: <CENTER><FONT SIZE=6>Modify Record</FONT></CENTER> 33: <HR WIDTH=80%> 34: <P> 35: <CENTER><TABLE BORDER=1 CELLSPACING=0> 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: <TR> <TD BGCOLOR="#c0c0c0" COLSPAN=2> <CENTER><B>MySQL/Perl Integration Example</B></CENTER> </TD> </TR> <TR> <TD BGCOLOR="#c0c0c0"><B>First Name:</B></TD> <TD><INPUT TYPE=TEXT SIZE=32 NAME="first_name" VALUE=$f_name></TD> </TR> <TR> <TD BGCOLOR="#c0c0c0"><B>Last Name:</B></TD> <TD><INPUT TYPE=TEXT SIZE=32 NAME="last_name" VALUE=$l_name></TD> </TR> <TR> <TD BGCOLOR="#c0c0c0"><B>Phone:</B></TD> <TD><INPUT TYPE=TEXT SIZE=32 NAME="phone" VALUE="$phone"></TD> </TR> <TR> <TD BGCOLOR="#c0c0c0"><B>E-mail:</B></TD> <TD><INPUT TYPE=TEXT SIZE=32 NAME="email" VALUE="$email"></TD> </TR> <TR> <TD BGCOLOR="#c0c0c0"><B>Notes:</B></TD> <TD><TEXTAREA NAME=notes WRAP=PHYSICALROWS=3COLS=30>$notes</TEXTAREA></TD> </TR> <TR> <TD BGCOLOR="#c0c0c0" COLSPAN=2> <CENTER><INPUT TYPE=SUBMIT VALUE="Modify Record"></CENTER></TD> </TR> </TABLE></CENTER> <P> <HR WIDTH=80%> <P> 68: <CENTER> 69: <FONT SIZE=4> 70: <A HREF="/sql/index.html">Main Page</A> 71: </FONT> 72: </CENTER> 73: </FORM> 74: </BODY></HTML> 75: HTML 76: } # End of subroutine. 77: ################ END PRINT OUTPUT SUBROUTINE modify2.cgi modifiziert die Datenbank 1: #!/usr/bin/perl 2: ### modify2.cgi 3: use CGI qw/:standard/; 4: require "common.sub"; 5: $old_email = $ENV{QUERY_STRING}; 6: $f_name = &filter(param(first_name)); 7: $l_name = &filter(param(last_name)); 8: $phone = &filter(param(phone)); 9: $email = &filter(param(email)); 10: $notes = &filter(param(notes)); 11: print header; 12: &Create_DB_Connection; 13: &write_data; 14: &print_output; 15: # Disconnect from the database 16: $dbh->disconnect; 17: ################ BEGIN WRITE DATA SUBROUTINE 18: sub write_data{ 19: $SQL="UPDATE phones SET 20: first_name = '$f_name', 21: last_name = '$l_name', 22: phone = '$phone', 23: email = '$email', 24: notes = '$notes' 25: 26: 27: WHERE email = '$old_email' "; 28: &Do_SQL; 29: } # End of write_data 30: ################ END WRITE DATA SUBROUTINE 31: ################ BEGIN PRINT OUTPUT SUBROUTINE 32: sub print_output{ 33: print<<HTML; 34: <HTML><BODY> 35: <CENTER><FONT SIZE=5> 36: Record modified in database 37: <P> 38: <A HREF="/sql/index.html">Return to Main Page</A> 39: </P> 40: </FONT></CENTER> 41: </BODY></HTML> 42: HTML 43: } # End of subroutine 44: ################ END PRINT OUTPUT SUBROUTINE Quelle: http://www.inlink.com/~perlguy/sql Ein in Perl programmiertes Adressbuch QUELLE: Linux-Magazin Verlag 1999 QUELLE: Linux-Magazin Verlag 1999 VERWEISE: http://www.geocities.com/ResearchTriangle/Node/9672/sqltut.html http://webreview.com/wr/pub/Perl http://postgresql.nextpath.com/ http://reference.perl.com/query.cgi?database http://www.w3.org/Security/Faq/www-security-faq.html http://www.perl.com http://www.perl.org http://www.apache.org http://www.akopia.de ... Akopia Interchange ist ein kompletter Shop in Perl http://www.cp.tc.ca ... Community Portal in Perl sämtliche Bücher im O´Reilly - Verlag (Larry Wall, Randal Schwartz, ...)