Как объединить импорт пакетов в единый пакет?

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

Кто-то поможет мне решить эту проблему.....

Ответ 1

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

Пример использования из pod:

Создание набора инструментов:

# 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/

Ответ 2

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

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

    return 1;
}

1;

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

Ответ 3

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

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.