5.5.4. Anpassad modul
det är bra att skapa din egen Perl-modul som är specifik för din webbplats. Om du är värd för olika webbplatser, eller har olikaapplikationer på din webbplats med olika utseende och känsla, kan du vilja skapa en modul för varje. Inom den här modulen kan du placeraunderrutiner som du befinner dig med över många CGI-skript.Dessa subrutiner varierar beroende på din webbplats, men man börhantera fel.
om du inte har skapat din egen Perl-modul tidigare, oroa dig inte, det är ganska enkelt. Exempel 5-3 visar enmycket minimal modul.
exempel 5-3. CGIBook::Error.pm
#!/usr/bin/perl -wTpackage CGIBook::Error;# Export the error subroutineuse Exporter;@ISA = "Exporter";@EXPORT = qw( error );$VERSION = "0.01";use strict;use CGI;use CGI::Carp qw( fatalsToBrowser );BEGIN { sub carp_error { my $error_message = shift; my $q = new CGI; my $discard_this = $q->header( "text/html" ); error( $q, $error_message ); } CGI::Carp::set_message( \&carp_error );}sub error { my( $q, $error_message ) = @_; print $q->header( "text/html" ), $q->start_html( "Error" ), $q->h1( "Error" ), $q->p( "Sorry, the following error has occurred: " ), $q->p( $q->i( $error_message ) ), $q->end_html; exit;}1;
den enda skillnaden mellan en perl-modul och ett standard Perl-skript äratt du ska spara din fil med a.pm extension, declarethe namnet på modulens paket med thepackagefunction (detta bör matcha filens namn utom utan the.pm förlängning och ersättning:: för/), och se till att det returnerar ett sant värde när det utvärderas (orsaken till1; längst ner).
när man bestämmer paketnamnet, bör filens namn vararelativ till en bibliotekssökväg i @INC. I ourexample lagrar vi filen på/usr/lib/perl5/site_perl/5.005/CGIBook/Error.pm./usr/lib/perl5/site_perl / 5.005 är en librarydirectory. Således är sökvägen till modulen i förhållande till librarydirectory CGIBook/Error.pm så paketet isCGIBook::Error.
det är standardpraxis att lagraversion av modulen i$VERSION. För enkelhets skull använder vi ocksåexportörmodulen för att exporterafelet subrutin. Detta gör att vi kan hänvisa tilldet i våra skript som Feli stället för CGIBook::Exporter::error. Se exportörens mansida eller en primär Perltext, t.ex. programmeringsperl, för mer information om användningexporter.
du har ett par alternativ för att spara den här filen. Den enklaste lösningenär att spara den inomsite_perl-katalogenav dina Perl-bibliotek, till exempel/usr/lib/perl5/site_perl/5.005/Cgibook/Error.pm.katalogen site_perl innehåller moduler som är platsspecifika (dvs. ingår inte i Perls standarddistribution). Banorna för dina Perl-bibliotek kan skilja sig åt; du kanlokalisera dem på ditt system med följande kommando:
$ perl -e 'print map "$_\n", @INC'
du vill förmodligen skapa en underkatalog som är unik för dinorganisation, som vi gjorde med CGIBook, för att hålla alla Perl-moduler du skapar.
du kan använda modulen enligt följande:
#!/usr/bin/perl -wTuse strict;use CGI;use CGIBook::Error;my $q = new CGI;unless ( check_something_important( ) ) { error( $q, "Something bad happened." );}
om du inte har behörighet att installera modulen i din Perllibrary-katalog, och om du inte kan få din systemadministratör att göra det, kan du placera modulen på en annan plats, forexample,/usr/local/apache/perl-lib/CGIBook/Error.pm.Då måste du komma ihåg att inkludera den här katalogen i listan somperl söker efter moduler. Det enklaste sättet att göra detta ärmedlib pragma:
#!/usr/bin/perl -wTuse strict;use lib "/usr/local/apache/perl-lib";use CGI;use CGIBook::Error;...