5.5.4. Aangepaste Module
het is een goed idee om uw eigen Perl-module te maken die specifiek is voor uw site. Als u host verschillende sites, of hebben verschillende applicaties binnen uw site met verschillende looks en voelt, je kanwish om een module voor elk te maken. Binnen deze module kun je subroutines plaatsen die je in veel CGI scripts gebruikt.Deze subroutines zullen variëren afhankelijk van uw site, maar men zou fouten moeten behandelen.
als u nog niet eerder uw eigen Perl-module hebt aangemaakt, maak u geen zorgen, het is vrij eenvoudig. Voorbeeld 5-3 toont avery minimale module.
voorbeeld 5-3. CGIBook::Fout.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;
Het enige verschil tussen een Perl-module en een standaard Perl script dat moet u het bestand opslaan met een.pm uitbreiding, declarethe naam van module pakket met thepackagefunction (deze moet overeenkomen met de naam van het bestand, behalve zonder.pm uitbreiding en vervanging:: voor /), en maken surethat het geeft true wanneer geëvalueerd (de reden voor de 1e; aan de onderkant).
bij het bepalen van de pakketnaam moet de naam van het bestand verwijzen naar een bibliotheekpad in @INC. In ons voorbeeld slaan we het bestand op in/usr/lib/perl5/site_perl/5.005/CGIBook/Error.pm./usr/lib/perl5/site_perl/5.005 is een bibliotheekdirectory. Zo is het pad naar de module relatief aan de librarydirectory CGIBook / Error.pm dus het pakket isCGIBook:: Error.
het is standaardpraktijk om de versie van de module in$VERSION op te slaan. Voor het gemak, gebruiken wij ook de Exporter module om de fout subroutine uit te voeren. Hierdoor kunnen we er in onze scripts naar verwijzen als errorin plaats van CGIBook::Exporter::error. Raadpleeg de Exportmanpage of een primaire Perl-tekst, zoals de programmering Perl, voor meer informatie over het gebruik van export.
u hebt een aantal opties om dit bestand op te slaan. De eenvoudigste oplossing is om het op te slaan in de site_perl directory van je Perl libraries, zoals/usr/lib/perl5/site_perl/5.005/CGIBook/Error.pm.de site_perl directory bevat modules die site-specifiek zijn (dat wil zeggen, niet opgenomen in Perl ‘ s standaarddistributie). De paden van uw Perl-bibliotheken kunnen verschillen; u kunt ze op uw systeem plaatsen met het volgende commando:
$ perl -e 'print map "$_\n", @INC'
u wilt waarschijnlijk een subdirectory maken die uniek is voor uw organisatie, zoals we deden met CGIBook, om alle Perl modules te bevatten die u maakt.
u kunt de module als volgt gebruiken:
#!/usr/bin/perl -wTuse strict;use CGI;use CGIBook::Error;my $q = new CGI;unless ( check_something_important( ) ) { error( $q, "Something bad happened." );}
als je niet de toestemming hebt om de module in je perllibrary directory te installeren, en als je de systeembeheerder er niet toe kunt overhalen om het te doen, dan kun je de module op een andere locatie plaatsen, bijvoorbeeld/usr/local/apache/perl-lib/CGIBook/Error.pm.Dan moet je niet vergeten om deze map op te nemen in de lijst dieperl zoekt naar modules. De eenvoudigste manier om dit te doen is met thelib pragma:
#!/usr/bin/perl -wTuse strict;use lib "/usr/local/apache/perl-lib";use CGI;use CGIBook::Error;...