Как мне сгруппировать импорт пакетов в один пользовательский пакет? - PullRequest
6 голосов
/ 18 марта 2010

Обычно, когда я пишу 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".

Кто-то помог мне выбраться из этой проблемы .....

Ответы [ 3 ]

5 голосов
/ 18 марта 2010

Взгляните на 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

Использование набора инструментов:

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 /

3 голосов
/ 18 марта 2010

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

  • Для прагм, таких как 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;

Для трех модулей это вряд ли стоит.

0 голосов
/ 18 марта 2010

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

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 .

...