perl. совсем простой вопрос про require.

Phoenix

можно заинклудить файл, находящий в той же директории?
т.е. есть 2 скрипта. в них есть одинаковый кусок. я его выделил в функцию и засунул в третий файл.
теперь
require "third.pl"
ругается, если запускать по абсолютному пути

Can't locate third.pl in @INC (@INC contains: /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/perl5/5.8.8 .) at /usr/local/etc/mrtg/scripts/acc.pl line 8.

sakura

Делай модуль!

Marinavo_0507

чёта типа use lib '.'

sakura

Текущая дирректория и так входит в список путей, где ищется. Надо модуль создавать и не париться.

Bibi

ну, как бы, такое, конечно, работает

#!/usr/bin/perl

use strict;
my $code = qq{sub a { print '!'; }};
eval $code;
&a;

но это изврат. если какая-то функция нужна в двух местах, то логичнее написать package. use с простым файлом не проканает и require тоже.

zya369

 #!/usr/bin/perl

use strict;
my $code = qq{sub a { print '!'; }};
eval $code;
&a;

к чему это ? :confused:

wwoland

Текущая дирректория и так входит в список путей, где ищется
Уверен?

kruzer25

Просто у автора треда, похоже, "текущая директория" - это не папка, где находятся скрипты, а папка, из которой он их запускает (что вполне логично) ;)

Geddi-S

Возможно, дело в том, что скрипт запускается не из текущей директории
Поэтому может помочь:

use FindBin qw($Bin);
use lib "$Bin";
require "third.pl";

Bibi

use с простым файлом не проканает и require тоже.
хм. оказывается, можно require использовать.
но это плохо с точки зрения разделения пространств имен. очень плохо.

Bibi

в смысле, настолько, что за это надо карать

Phoenix

это только в перле такое поведение?
я ведь простую функцию выделил в файл без претензий на очень далёкое использование.

rosali

require принимает параметром не имя _файла_, а имя модуля. То есть require X :: Y :: Z превращается в загрузку файла X/Y/Z.pm, загрузить файл с расширением .pl через require нельзя, зато можно через do. принципиальное отличие do от require состоит в том, что require одного и того же модуля не будет производиться дважды. напоминаю ;) что use это тот же require только завернутый в BEGIN и с вызовом import.

Bibi

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

Bibi

загрузить файл с расширением .pl через require нельзя
я только что попробовал --- можно, но при этом если в главном файле есть функция с таким же именем, то она будет игнорироваться в пользу функции из подключенного файла.

rosali

> когда эту функцию захочется использовать еще где-нибудь
не надо пользоваться всякой хуйнёй "еще где нибудь" ;) code reuse не является самоцелью. вообще не надо считать, что любой экран кода становится "библиотекой" просто от того что его вынесли в отдельный файл.

Bibi

> code reuse не является самоцелью
конечно, не является. это, предже всего, средство от необходимости внесения однотипных изменений при модификации кода. просто, если скрипт не из разряда "написали десять строк, сделали работу и забыли", то дальнейшие изменения и рост кода весьма вероятны.

Irina22

ура!
do работает, но если запускать не из той же дириктории -тогда пишет, что функцию не знает

Irina22

понимаешь в чём дело,
из двух зол: поместить одинаковый код копипастов в два файла и создать свой модуль для функции из 10 строк, я выбрал первое.

Bibi

ну и неправильно. второй вариант --- это не зло, а единственно верный путь, а первый --- источник большого геморра.
правила очень простые: как только возникает необходимость скопипастить что-то длиннее строчки, параметризуй и создай функцию, как только захотелось использовать одну функцию в двух местах, позаботься об окружении и вынеси в модуль. это действительно единственно верный путь.

shlyumper

Вообще, рекомендуют ради двух копипастов не заморачиваться.
http://en.wikipedia.org/wiki/Rule_of_three_%28programming%29
Оставить комментарий
Имя или ник:
Комментарий: