Как включить функции из другого файла в 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;