perl. совсем простой вопрос про require.
Делай модуль!
чёта типа use lib '.'
Текущая дирректория и так входит в список путей, где ищется. Надо модуль создавать и не париться.
#!/usr/bin/perl
use strict;
my $code = qq{sub a { print '!'; }};
eval $code;
&a;
но это изврат. если какая-то функция нужна в двух местах, то логичнее написать package. use с простым файлом не проканает и require тоже.
#!/usr/bin/perl
use strict;
my $code = qq{sub a { print '!'; }};
eval $code;
&a;
к чему это ?
Текущая дирректория и так входит в список путей, где ищетсяУверен?
Просто у автора треда, похоже, "текущая директория" - это не папка, где находятся скрипты, а папка, из которой он их запускает (что вполне логично)
Поэтому может помочь:
use FindBin qw($Bin);
use lib "$Bin";
require "third.pl";
use с простым файлом не проканает и require тоже.хм. оказывается, можно require использовать.
но это плохо с точки зрения разделения пространств имен. очень плохо.
в смысле, настолько, что за это надо карать
я ведь простую функцию выделил в файл без претензий на очень далёкое использование.
require принимает параметром не имя _файла_, а имя модуля. То есть require X :: Y :: Z превращается в загрузку файла X/Y/Z.pm, загрузить файл с расширением .pl через require нельзя, зато можно через do. принципиальное отличие do от require состоит в том, что require одного и того же модуля не будет производиться дважды. напоминаю что use это тот же require только завернутый в BEGIN и с вызовом import.
почти все скрипты, которые используются дольше дня, требуют последующего вмешательства. а если скрипты такие, что не помещаются в один файл, лучше позаботиться о себе с самого начала --- это может избавить от неприятных неожиданностей в будущем, когда эту функцию захочется использовать еще где-нибудь.
загрузить файл с расширением .pl через require нельзяя только что попробовал --- можно, но при этом если в главном файле есть функция с таким же именем, то она будет игнорироваться в пользу функции из подключенного файла.
не надо пользоваться всякой хуйнёй "еще где нибудь" code reuse не является самоцелью. вообще не надо считать, что любой экран кода становится "библиотекой" просто от того что его вынесли в отдельный файл.
конечно, не является. это, предже всего, средство от необходимости внесения однотипных изменений при модификации кода. просто, если скрипт не из разряда "написали десять строк, сделали работу и забыли", то дальнейшие изменения и рост кода весьма вероятны.
do работает, но если запускать не из той же дириктории -тогда пишет, что функцию не знает
из двух зол: поместить одинаковый код копипастов в два файла и создать свой модуль для функции из 10 строк, я выбрал первое.
правила очень простые: как только возникает необходимость скопипастить что-то длиннее строчки, параметризуй и создай функцию, как только захотелось использовать одну функцию в двух местах, позаботься об окружении и вынеси в модуль. это действительно единственно верный путь.
Оставить комментарий
Phoenix
можно заинклудить файл, находящий в той же директории?т.е. есть 2 скрипта. в них есть одинаковый кусок. я его выделил в функцию и засунул в третий файл.
теперь
require "third.pl"
ругается, если запускать по абсолютному пути