2010-03-18 13 views
6

Normalerweise, wenn ich das Perl-Programm schreibe. Früher habe ich folgendes Paket mitgenommen.Wie gruppiere ich meine Paketimporte in ein einzelnes benutzerdefiniertes Paket?

use strict ; 
use warnings ; 
use Data::Dumper ; 

Jetzt möchte ich so, ich werde nicht all dieses Paket für jedes Programm enthalten. dafür
Ich werde diese alle Paket in meinem eigenen Paket haben. wie folgt.

my_packages.pm

package my_packages ; 
{ 
use strict ; 
use warnings ; 
use Data::Dumper; 
} 
1; 

Also, dass, wenn ich my_packages.pm in Perl-Programm hinzufügen, muss es haben alle oben genannten Pakete.

Eigentlich habe ich dieses Experiment gemacht. Aber ich kann diese Dinge nicht bekommen. was bedeutet, wenn ich my_packages benutze. Ich bin nicht in der Lage, die Funktionalität von "strikte Verwendung, Warnungen verwenden, verwenden Sie Data :: Dumper".

Jemand mir aus diesem Problem helfen .....

+0

Siehe auch http://stackoverflow.com/questions/1678263/ho w-can-i-extend-mooses-automatisches-pragma-exports, das dasselbe über Moose-Module diskutiert. – Ether

Antwort

5

Werfen Sie einen Blick auf ToolSet, die alle schmutzigen Importarbeiten für Sie erledigt.

Anwendungsbeispiel von pod:

Erstellen eines ToolSet:

# My/Tools.pm 
package My::Tools; 

use base 'ToolSet'; 

ToolSet->use_pragma('strict'); 
ToolSet->use_pragma('warnings'); 
ToolSet->use_pragma(qw/feature say switch/); # perl 5.10 

# define exports from other modules 
ToolSet->export(
'Carp'   => undef,  # get the defaults 
'Scalar::Util' => 'refaddr', # or a specific list 
); 

# define exports from this module 
our @EXPORT = qw(shout); 
sub shout { print uc shift }; 

1; # modules must return true 

eine ToolSet Verwendung:

use My::Tools; 

# strict is on 
# warnings are on 
# Carp and refaddr are imported 

carp "We can carp!"; 
print refaddr []; 
shout "We can shout, too!"; 

/I3az/

0

sehen:

package Foo; 

use warnings; 

sub import { 
    warnings->import; 
} 

1; 

Und jetzt:

$ perl <<CUT 
> use Foo; 
> \$a = 5; # backslash just to keep the $ from being eaten by shell 
> CUT 
Name "main::a" used only once: possible typo at - line 2. 

von Modern::Perl genommen.

3

Dies ist schwieriger als Sie erwarten.

  • Für Pragmas wie strict und warnings Sie können sie passieren.

  • Für Module, die keine Funktionen wie objektorientierte exportieren, wird es funktionieren.

  • Aber für Module, die standardmäßig exportieren, wie Data :: Dumper (es gibt Ihnen die Dumper() Funktion im Paket des Aufrufers), ist es schwieriger.

Sie können es durch Exporter sagen funktioniert, dass es eine zusätzliche Schicht von Magie ist:

So könnten Sie tun:

package my_packages; 

use strict; 
use warnings; 
use Data::Dumper; 
use IO::Socket; 


$Exporter::ExportLevel = 1; # Tell Exporter to export to the caller 

sub import { 

    # Enable this in the callers package 

    strict->import;  # pragma in caller 
    warnings->import;  # pragma in caller 
    Data::Dumper->import; # Adds Dumper() to caller 

    # No need for IO::Socket since it's OO. 

    return 1; 
} 

1; 

Für drei Module, scheint dies kaum der Rede wert zu sein es.

Verwandte Themen