hotti: perl-beispiele im wiki

Beitrag lesen

hi,

Ich freu mich aufs Lesen.

Ein Script habe ich schon fertig, kannst Du es mal testen und versuchen nachzuvollziehen, was ich mir dabei gedacht habe?

package main; steht hier für eine einfache Responseklasse und nur für diese eine Anwendung. Diese Klasse könnte genausogut als Basisklasse für alle möglichen Extensions dienen, guck mal, ob Du die Basismethoden erkennst ;)

Ansonsten ist das doch alles selbsterklärend.

Text::Template als einfache Template-Engine müsstest Du mal fix installieren.

  
#!/usr/bin/perl  
  
use strict;  
use warnings;  
use Text::Template;  
use HTTP::Headers;  
require CGI;  
use CGI::Carp qw(fatalsToBrowser);  
  
package main;  
  
# main control, das Response-Objekt als Instanz der Klasse main  
my $mc = main->new() or die $@; # CGI::Carp würde hier einspringen  
  
# Diese Klasse kennt nur einen Content-Type  
$mc->set_header("Content-Type" => "text/html; charset=UTF-8");  
  
# TRY-Block  
eval{  
	# die Methoden init(), browse(), control() dürfen Exceptions werfen  
	$mc->init();  
	if($mc->param()) { $mc->control() }  
	else{ $mc->browse() }  
};  
# CATCH Exceptions, in Perl ist der dazugehörige Text in $@ zu finden  
if(my $EVE = $@){  
	print $mc->header(), qq(<pre>Fehler: $EVE</pre>);  
}  
else{  
	print $mc->header(), $mc->bodybuild();  
}  
  
  
########################### Methods #######################################  
  
# Erstelle eine Instanz der package (class) main  
# Konstruktor  
sub new{  
	my $class = shift;  
	my $self = bless{}, $class;  
	return eval{  
		$self->{HTTP_HEADERS} = HTTP::Headers->new();		  
		$self->{TEXT_TEMPLATE} = Text::Template->new(TYPE => 'FILEHANDLE', SOURCE => *DATA ) or die $@;  
		$self->{CGI} = new CGI;  
		$self->{STASH} = {};  # Data-Hash für das Template  
		$self;  
	};  
}  
  
# Template-Prozess und Rückgabe des BODY  
sub bodybuild{  
	my $self = shift;  
	return $self->{TEXT_TEMPLATE}->fill_in( HASH => $self->{STASH});  
}  
  
# Zusätzliche Funktion, steht über browse() und über control()  
sub init{  
	my $self = shift;  
	$self->{STASH}{date} = localtime;  
	$self->{STASH}{url}  = $ENV{SCRIPT_NAME};  
}  
# der Controller  
sub control{  
	my $self = shift;  
	if($self->param('calc')){  
		# fülle das Formular wieder mit den eingegebenen Werten  
		$self->{STASH}{Zahl_a} = trim($self->param('Zahl_a'));  
		$self->{STASH}{Zahl_b} = trim($self->param('Zahl_b'));	  
	  
		# prüfe die Eingaben im STASH  
		if(! $self->{STASH}{Zahl_a}){  
			$self->{STASH}{mesg} = "Zahl a fehlt, bitte zwei Zahlen eingeben!";  
			return;  
		}  
		elsif(! $self->{STASH}{Zahl_b}){  
			$self->{STASH}{mesg} = "Zahl b fehlt, bitte zwei Zahlen eingeben!";  
			return;  
		}  
		elsif($self->{STASH}{Zahl_a} !~ /^\d+$/){  
			$self->{STASH}{mesg} = "Zahl a ist keine Ganze Zahl!";  
			return;  
		}  
		elsif($self->{STASH}{Zahl_b} !~ /^\d+$/){  
			$self->{STASH}{mesg} = "Zahl b ist keine Ganze Zahl!";  
			return;  
		}  
		else{ # Ergebnis kann ausgegeben werden  
			my $res = $self->{STASH}{Zahl_a} + $self->{STASH}{Zahl_b};  
			$self->{STASH}{mesg} = $res;  
		}  
	}  
	else{  
		# werfe eine Exception  
		die "Unbekannter Parameter!\n";  
	}  
}  
# Methode wird aufgerufen, wenn keine GET/POST Parameter im Request sind  
sub browse{  
	my $self = shift;  
	$self->{STASH}{mesg} = "Bitte nur ganze Zahlen eingeben!";  
}  
# Leerzeichen am Anfang und am Ende entfernen  
# Am Ende werden auch etwaige Zeilenumbrüche entfernt  
sub trim{  
	my $s = shift;  
	$s =~ s/^\s+//;  
	$s = unpack "A*", $s;  
	return $s;  
}  
  
########################### Delegations ###################################  
# HTTP::Headers  
# die zu delegierenden Methoden bekommen hier andere Namen  
sub set_header{  
	my $self = shift;  
	return $self->{HTTP_HEADERS}->header(@_);  
}  
# gibt alle gesetzten Header als String zurück  
sub header{  
	my $self = shift;  
	return $self->{HTTP_HEADERS}->as_string(@_, "\n\n");  
}  
  
# CGI, delegiere die param()-Methode mit demselben Namen wie CGI::param()  
sub param{  
	my $self = shift;  
	return $self->{CGI}->param(@_);  
}  
###########################################################################  
# Das Template ist unterhalb des Tokens __DATA__ notiert  
__DATA__  
<h1>Ein einfaches Formular, Date: {$date}</h1>  
  
<p>Hinweis/Ergebnis: {$mesg}</p>  
  
<form action="{$url}">  
	<fieldset><legend><strong>Zahl a, Zahl b, Enter:</strong></legend>  
		<input name="Zahl_a" value="{$Zahl_a}" title="Zahl a">  
		<input name="Zahl_b" value="{$Zahl_b}" title="Zahl b">  
		<input type="submit" name="calc" value="Summe a+b berechnen">  
	</fieldset>  
</form>  
  
<p>  
	<a href="{$url}">Form ohne Parameter neu Laden</a>  
</p>