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

60

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

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

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

  • 8
    Внушительное включение сценариев друг в друга требует боли. Разница между модулем и скриптом в коде очень мала, но инкапсуляция намного лучше. Какие конкретные вещи заставляют вас думать, что для использования модулей потребуется большая перезапись?
  • 3
    Руководства, которые я просматривал в Интернете, делали создание и добавление модулей более сложной задачей, чем на самом деле. Спасибо за показ мне своей простоты
Теги:
include

8 ответов

61
Лучший ответ

Используйте модуль. Проверьте 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 );

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

  • 3
    Проверьте Sub :: Exporter это все восторженные! search.cpan.org/~rjbs/Sub-Exporter-0.982/lib/Sub/Exporter.pm
  • 3
    Кроме того, если вы не устанавливаете модуль в одном из местоположений по умолчанию для модулей Perl, просто добавьте это перед «use Foo;» строка: используйте lib ('C: / Module / Location');
Показать ещё 6 комментариев
40

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, подвергаются более ранним проверкам времени компиляции.
  • 2
    Из того, что я могу сказать, этот файл более сравним с #include C, и это именно то, что мне нужно.
  • 0
    A package allows you to expose some functions, but hide others. With no packages, all functions are visible. как нам это сделать?
7

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

5

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

4

Я знаю, что вопрос конкретно говорит о "функциях", но я получаю этот пост высоко в поиске, когда я ищу "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
3

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

3

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

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

1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню