Как включить функции из другого файла в Perl script?

Это похоже на очень простой вопрос, но каким-то образом мой Google-Фу не смог меня.

Какой синтаксис для включения функций из других файлов в Perl? Я ищу что-то вроде C #include "blah.h"

Я видел вариант использования модулей Perl, но похоже, что это потребует незначительной перезаписи моего текущего кода.

Ответ 1

Используйте модуль. Проверьте perldoc perlmod и Exporter.

В файле Foo.pm

package Foo;
use strict;
use warnings;
use Exporter;

our @ISA= qw( Exporter );

# these CAN be exported.
our @EXPORT_OK = qw( export_me export_me_too );

# these are exported by default.
our @EXPORT = qw( export_me );

sub export_me {
    # stuff
}

sub export_me_too {
    # stuff
}

1;

В вашей основной программе:

use strict;
use warnings;

use Foo;  # import default list of items.

export_me( 1 );

Или для получения обеих функций:

use strict;
use warnings;

use Foo qw( export_me export_me_too );  # import listed items

export_me( 1 );
export_me_too( 1 );

Вы также можете импортировать переменные пакета, но практика сильно обескуражена.

Ответ 2

Perl require выполнит эту работу. Вам нужно будет убедиться, что любые требуемые файлы возвращают правду, добавляя

1;

в конце файла.

Здесь крошечный пример:

$ cat m1.pl 
use strict;
sub x { warn "aard"; }
1;

$ cat m2.pl 
use strict;
require "m1.pl";
x();

$ perl m2.pl 
aard at m1.pl line 2.

Но перейдите в модули , как только сможете.

ИЗМЕНИТЬ

Несколько преимуществ переноса кода из сценариев в модули:

  • Без пакетов все занимает одно пространство имен, поэтому вы можете столкнуться с ситуацией, когда две функции из отдельных файлов хотят иметь одинаковое имя.
  • Пакет позволяет вам выставлять некоторые функции, но скрывать других. Без пакетов все функции видны.
  • Файлы, включенные в require, загружаются только во время выполнения, тогда как пакеты, загруженные с помощью use, подвергаются более ранним проверкам времени компиляции.

Ответ 3

Я считаю, что вы ищете require или use.

Ответ 4

Кроме того, do 'file.pl'; будет работать, но модули являются лучшим решением.

Ответ 5

Я знаю, что вопрос конкретно говорит о "функциях", но я получаю этот пост высоко в поиске, когда я ищу "perl include", и часто раз (например, сейчас) я хочу включить переменные (простым способом, без думать о модулях). И поэтому я надеюсь, что здесь будет опубликован мой пример (см. Также: Perl require и переменные; вкратце: используйте require и убедитесь, что оба файла "includeser" и "includesee" объявляют переменную как our):

$ perl --version

This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...

$ cat inc.pl
use warnings;
use strict;

our $xxx = "Testing";

1;

$ cat testA.pl 
use warnings;
use strict;

require "inc.pl";
our $xxx;

print "1-$xxx-\n";
print "Done\n";

$ perl testA.pl 
1-Testing-
Done


$ cat testB.pl 
use warnings;
use strict;

our $xxx;
print "1-$xxx-\n";

$xxx="Z";
print "2-$xxx-\n";

require "inc.pl";

print "3-$xxx-\n";
print "Done\n";

$ perl testB.pl 
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
1--
2-Z-
3-Testing-
Done

Ответ 6

Вы действительно должны изучить модули perl, однако для быстрого взлома вы всегда можете запустить "perl -P", который запускает ваш perl script через предварительный процессор C. Это означает, что вы можете делать #include и друзей....

Только быстрый взломать, будьте осторожны; -)

Ответ 7

Что вы ищете, это "require file.pl", но то, что вы должны смотреть, это "использовать модуль".

Ответ 8

Вышеупомянутые ответы на все игнорируются частью клиента: как импортировать модуль.

См. принятый ответ здесь: Как использовать модуль Perl из относительного местоположения?

Без трюка в этом ответе у вас будет много проблем с попыткой получить путь к модулю, когда вы use $mymodule;