2010-03-18 1 views
6

Обычно, когда я пишу программу perl. Я использовал следующий пакет.Как мне объединить импорт пакетов в один настраиваемый пакет?

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

Теперь, я хочу, чтобы это не включало весь этот пакет для каждой программы. для этого
У меня будет весь пакет в моем собственном пакете. подобный следующий.

my_packages.pm

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

Так, что если добавить my_packages.pm в программе Perl, он должен иметь все вышеуказанные пакеты.

На самом деле я сделал это экспериментирование. Но я не могу этого добиться. , что означает, когда я использую my_packages. Я не могу получить функциональность «использовать строгие, использовать предупреждения, использовать Data :: Dumper».

Кто-то помочь мне из этой проблемы .....

+0

Смотрите также HTTP://stackoverflow.com/questions/1678263/ho w-can-i-extend-mooses-automatic-pragma-exports, который обсуждает то же самое, но касается модулей Moose. – Ether

ответ

5

Посмотрите на ToolSet, который выполняет всю грязную импортную работу для вас.

Пример использования из стручка:

Создание 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 

Использование Toolset:

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

Смотреть это:

package Foo; 

use warnings; 

sub import { 
    warnings->import; 
} 

1; 

А теперь:

$ 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. 

Взятые из Modern::Perl.

3

Это сложнее, чем вы ожидаете.

  • Для прагмах как strict и warnings вы можете передать их через.

  • Для модулей, которые не экспортируют такие функции, как объектно-ориентированные, он будет работать.

  • Однако для модулей, которые экспортируют по умолчанию, например Data :: Dumper (он дает вам функцию Dumper() в пакете вызывающего абонента), это сложнее.

Вы можете заставить его работать, говоря Exporter, что есть дополнительный слой магии:

Так что вы можете сделать:

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; 

Для трех модулей, это вряд ли, кажется, стоит Это.

Смежные вопросы