Неправильный @INC в Activestate Perl в Windows

Я использую ActiveState perl с Komodo Edit. Я получаю следующую ошибку.

Can't locate MyGengo.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) 
at D:\oDesk\MyGengo Integration\sample line 6.

Почему интерпретатор смотрит в C:/Perl/lib, а не в C:\Perl\lib? Разве он не знает, что это Windows, а не Linux?

ИЗМЕНИТЬ

Я решил проблему, скопировав файл .pm в каталог C:\Perl\lib. Думаю, проблема возникла из-за того, что этот модуль был загружен вручную. При установке PPM файл .pm будет скопирован в каталог lib.


person cppcoder    schedule 26.05.2012    source источник
comment
Это не проблема, оба работают для Perl в Windows (при условии, что обратная косая черта (стиль Windows) правильно экранирована - на самом деле вам следует рассматривать только использование косой черты, меньше шансов получить проблемы).   -  person Mat    schedule 26.05.2012
comment
Вопрос может быть в каталогах, но ваша проблема в том, что ваш модуль MyGengo.pm не находится там, где ваш скрипт может его увидеть, который находится в любом из трех каталогов, перечисленных в @INC.   -  person TLP    schedule 26.05.2012
comment
@TLP Модуль присутствует в этом каталоге C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengo   -  person cppcoder    schedule 26.05.2012
comment
@cppcoder С оператором use MyGengo perl будет искать c:/perl/lib/MyGengo.pm. Каталоги обозначаются двойным двоеточием, так что use MyGengo::Foo будет находиться в c:/perl/lib/MyGengo/Foo.pm.   -  person TLP    schedule 26.05.2012


Ответы (1)


Что касается Windows, C:/Perl/lib и C:\Perl\lib - это один и тот же каталог.

Примечания к документации по perlport (выделено мной)

DOS и производные

Perl уже давно портирован на микрокомпьютеры в стиле Intel, работающие под такими системами, как PC-DOS, MS-DOS, OS / 2 и большинство платформ Windows, о которых вы можете упомянуть (кроме Windows CE, если вы считаете это). Пользователи, знакомые с оболочками стиля COMMAND.COM или CMD.EXE, должны знать, что каждая из этих спецификаций файла может иметь небольшие различия:

my $filespec0 = "c:/foo/bar/file.txt";
my $filespec1 = "c:\\foo\\bar\\file.txt";
my $filespec2 = 'c:\foo\bar\file.txt';
my $filespec3 = 'c:\\foo\\bar\\file.txt';

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

Ваш комментарий показывает, что вы используете mygengo-perl-new, но установили его в C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengo. Это необычное место для установки модуля. В соответствии с тем, как модуль написан, он ожидает, что mygengo.pm будет находиться в одном из каталогов, указанных в @INC. Затем клиентский код втягивает его с помощью

use mygengo;

Я предлагаю переместить mygengo.pm с C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengo на C:\Perl\site\lib.

В качестве альтернативы, если вы используете mygengo как часть другого разрабатываемого вами пакета, вы можете добавить mygengo в свое дерево исходных текстов, возможно, как git submodule. Не забудьте добавить use lib 'mygengo';, если сделаете это таким образом.

Для получения полной информации прочтите о @INC процессе поиска в документации perlfunc на require и < href = "http://perldoc.perl.org/functions/use.html" rel = "nofollow"> дополнительная семантика для модулей через use.

Общие советы по использованию косой черты и обратной косой черты

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

# my $dir = "C:\Perl\lib";  # oops, $path would be 'C:Perlib'

$dir = "C:\\Perl\\lib";

Ситуация может быть немного лучше внутри строк в одинарных кавычках. Установка $dir как в

$dir = 'C:\Perl\lib';

делает то, что вы ожидаете, но скажите, что вы хотите, чтобы $dir имел завершающую косую черту.

$dir = 'C:\Perl\lib\';

Теперь у вас синтаксическая ошибка.

Can't find string terminator "'" anywhere before EOF at dirstuff line n.

Вы можете интерполировать другое значение в $dir.

$dir = 'C:\Perl\lib\$module';  # nope

Ах да, для интерполяции нужны двойные кавычки.

$dir = "C:\Perl\lib\$module";  # still not right

После головокружения и отладки

$dir = "C:\\Perl\\lib\\$module";  # finally

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

Как отмечается в perlport, командная оболочка Windows обрабатывает косую черту как вводные параметры и обратная косая черта в качестве разделителей пути. Если вы не можете избежать оболочки, возможно, вам придется иметь дело с обратной косой чертой.

person Greg Bacon    schedule 26.05.2012
comment
Модуль присутствует в C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengo. Итак, Perl должен найти это правильным? - person cppcoder; 26.05.2012
comment
Это каталог, содержащий MyGengo.pm? Если нет, то где это? Вы используете myGengo-perl? Полная документация по разрешению модуля находится в документации perlfunc на require - person Greg Bacon; 26.05.2012
comment
Да, в вставленном мной каталоге есть MyGengo.pm. - person cppcoder; 26.05.2012
comment
Я загрузил библиотеку и вручную скопировал ее в каталог C:\Perl\lib\MyGengo. - person cppcoder; 26.05.2012
comment
Да, я скопировал .pm из исходного каталога и поместил его в C:\Perl\lib - person cppcoder; 26.05.2012
comment
Можете ли вы сказать мне разницу между местоположениями C:\Perl\lib и C:\Perl\site\lib в вашем ответе? - person cppcoder; 26.05.2012
comment
Разница в основном обычная. C:\Perl\site\lib - это библиотека вашего местного сайта. Вы контролируете это. C:\Perl\lib - это ваша библиотека для установки Perl. Например, если вы удалите ActivePerl, библиотека вашего сайта останется нетронутой. - person Greg Bacon; 26.05.2012