Как включить функции из другого файла в мой скрипт Perl? - PullRequest
64 голосов
/ 11 ноября 2009

Это кажется очень простым вопросом, но почему-то мой Google-Fu подвел меня.

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

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

Ответы [ 8 ]

65 голосов
/ 11 ноября 2009

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

В файле 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 );

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

46 голосов
/ 11 ноября 2009

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

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.

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

EDIT

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

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

Я полагаю, вы ищете Требуется или Используйте ключевые слова.

7 голосов
/ 12 ноября 2009

Также, do 'file.pl'; будет работать, но модули - лучшее решение.

5 голосов
/ 20 января 2013

Я знаю, что вопрос конкретно говорит о «функциях», но я получаю эту статью высоко в поиске, когда я ищу «perl include», и часто (как сейчас) я хочу включить переменные (простым способом, без приходится думать о модулях). И поэтому я надеюсь, что все в порядке, чтобы опубликовать мой пример здесь (см. Также: Требуется Perl и переменные ; вкратце: используйте require, и убедитесь, что оба файла "includeder" и "includee" объявили переменную как 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
4 голосов
/ 11 ноября 2009

То, что вы ищете, это 'require file.pl', но то, что вы должны посмотреть, это 'use module'.

4 голосов
/ 11 ноября 2009

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

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

3 голосов
/ 06 марта 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...