Homepage Inspire-world | Forum
CGI/Perl Workshops Subroutinen erstellen und verwenden

 Inhaltsverzeichnis/Workshops Übersichtsseite/Subroutinen erstellen und verwenden
In diesem Workshop, der nach Fertigstellung mehere Kapitel umfasst, soll es um Subroutinen und deren Verwendung, Einbindung und Parameterübergabe gehen.

Subroutinen kann man sich vorstellen als getrennt arbeitende Programmabschnitte eines Hauptprogrammes. Dabei können von jeder Subroutine zur anderen Daten übergeben werden. Auch das einbinden von weiteren Subroutinen in die (Haupt)Unterroutinen ist leicht möglich.

Ein großes Anwendungsfeld von Subroutinen sind Foren, Gästebücher, Programmadministrationen uvam. Programme ohne Subroutinen sind eher selten anzutreffen da es Sinn macht Programme in Teilabschnitte aufzugliedern.

1. Zunächt einmal die Subroutinendefinition

Grundsätzlich wird eine Subroutine in ihrer einfachsten Form so notiert:

sub subroutinenname {

... Programmcode der Subroutine

}
Der Aufruf einer Subroutine an anderer Stelle erfolgt mit:

&subroutinenname;

1.1. Ein erstes einfaches Beispiel

Hier ein kleines Script welches die Funktionsweise und gleichzeitig eine Möglichkeit des Aufrufens von Subroutinen darstellt.
#!/usr/bin/perl
# Die obere Zeile nötigenfalls anpassen 
########################################################################

use CGI::Carp qw(fatalsToBrowser);

# Angabe was als "Kommando" genutzt werden soll um Subroutinen aufzurufen
$aktion = $ENV{"QUERY_STRING"};

# Definition welche Subroutine starten bei welchem Query String
if ($aktion eq "") { 
	&hauptseite;
}
if ($aktion eq "seite1") {
	&seite1;
}
if ($aktion eq "seite2") {
	&seite2;
}

########################################################################
# Hauptseite
########################################################################
sub hauptseite {
print "Content-type: text/html\n\n";	
&header;
&links;	

print qq~
<font face="Verdana, Arial" size="2">Subroutine Hauptseite
<br><br>
... weitere Programmanweisungen
</font>
~;

&footer;
}
########################################################################
# Seite 1
########################################################################
sub seite1 {
print "Content-type: text/html\n\n";	
&header;
&links;	

print qq~
<font face="Verdana, Arial" size="2">Subroutine Seite 1
<br><br>
... weitere Programmanweisungen
</font>
~;

&footer;
}
########################################################################
# Seite 2
########################################################################
sub seite2 {
print "Content-type: text/html\n\n";	
&header;
&links;	

print qq~
<font face="Verdana, Arial" size="2">Subroutine Seite 2
<br><br>
... weitere Programmanweisungen
</font>
~;

&footer;
}

########################################################################
# Linkleiste
########################################################################
# Diese Subroutine wird in alle anderen eingebunden

sub links {
print qq~	
<div align="center"><font face="Verdana, Arial" size="2">
<a href=subroutine.pl>Hauptseite</a> | 
<a href=subroutine.pl?seite1>Seite 1</a> | 
<a href=subroutine.pl?seite2>Seite 2</a>
</font></div><br>
~;
}

########################################################################
# Header und Footer Subroutine
########################################################################
# Header für alle Subroutinen
sub header {
print qq~
<html>
<head>
<title>Subroutinen Navigation Beispiel</title>
</head>
<body bgcolor="#F6F6F6" alink="#FF0000" vlink="#800000" text="#000000" link="#000080">
~;
}

########################################################################
# Footer für alle Subroutinen
sub footer {
print qq~
</body>
</html>
~;
}
########################################################################

1.2 Erklärungen dazu

1. Das ansteuern der Subroutinen

# Angabe was als "Kommando" genutzt werden soll um Subroutinen aufzurufen
$aktion = $ENV{"QUERY_STRING"};

# Definition welche Subroutine starten bei welchem Query String
if ($aktion eq "") { 
	&hauptseite;
}
if ($aktion eq "seite1") {
	&seite1;
}
if ($aktion eq "seite2") {
	&seite2;
}
Bei $aktion = $ENV{"QUERY_STRING"}; wird festgelegt das die Aktionen durch den Query String Namen bestimmt werden. Ein Query String ist der Teil der URL der nach dem ? kommt. Dies sieht dann hier im Beispiel so aus. ...subroutine.pl?seite1

Nun folgen drei if Abfragen die die Parameter zum aufrufen der Subroutinen enthalten.
if ($aktion eq "") { 
	&hauptseite;
}
oder
if ($aktion eq "seite1") {
	&seite1;
}
Bei der ersten steht aber doch gar kein Parameter? aktion eq "" Nun dies ist hier auch nicht unbedingt nötig. eq "" seht hier für soviel wie "ist leer". Also wird beim aufruf des Programmes ohne Subroutinenparameter die Subroutine &hauptseite; gestartet. Dies ist in sofern sinnvoll, da hier der User einfach nur die URL zum Script angeben muss in der Browserzeile und nicht den Query String auch noch mit.

2. Nun folgen die einzelnen Subroutinen

########################################################################
# Seite 1
########################################################################
sub seite1 {
print "Content-type: text/html\n\n";	
&header;
&links;	

print qq~
<font face="Verdana, Arial" size="2">Subroutine Seite 1
<br><br>
... weitere Programmanweisungen
</font>
~;

&footer;
}
########################################################################
Diese hier will ich einmal erklären.
sub seite1 { = Subroutinenanfang
print "Content-type: text/html\n\n"; = Angabe den Content Types
&header; = Aufruf der Unterroutine header
&links; = Aufruf der Unterroutine links
print qq~ ... ~; = Ausgabe von HTML Code
&footer; = Aufruf der Unterroutine footer
} = Ende der Subroutine

Um die Subroutinen gut voneinander abzugrenzen sollte man diese mit Kommentaren kenntlich machen. Dies erleichtert auch bei großen Programmen die Übersichtlichkeit wenn etwas im Code editiert wrden soll.
########################################################################
# Seite 1
########################################################################
Ich denke dies Beispiel verdeutlich zumindest gut wie Subroutinen genutzt werden können und dabei auch Code gespart werden kann. Würde man z.B. nicht diese Möglichkeit nutzen können Subroutinen in Subroutinen einzubinden wäre hier in jeder Subroutine viel mehr Code zu notieren. So müsste der kommpette Header und Footer sowie der Code der Links komplett notiert werden.

» Weiter zu Subroutinen aus externen Dateien benutzen



 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Subroutinen erstellen und verwenden
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!