繁体   English   中英

Windows中的Activestate Perl中的@INC不正确

[英]Incorrect @INC in Activestate Perl in 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吗?

编辑

我通过在C:\\Perl\\lib目录中复制.pm文件解决了这个问题。 我想,自从这个模块被手动下载以来,问题就出现了。 PPM安装会将.pm文件复制到lib目录。

就Windows而言, C:/Perl/libC:\\Perl\\lib是同一目录。

perlport文档说明(强调添加)

DOS和衍生物

Perl长期以来一直被移植到运行在PC-DOS,MS-DOS,OS / 2等系统下的英特尔式微型计算机,以及大多数可以提及的Windows平台(除了Windows CE,如果算上这些)。 熟悉COMMAND.COMCMD.EXE样式shell的用户应该知道这些文件规范中的每一个都可能有细微差别:

 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复古的许多命令行实用程序都将/视为选项前缀,因此可能会被包含/的文件名混淆。 除了调用任何外部程序, /将工作得很好,可能更好,因为它更符合流行的用法,并避免记住什么回击和什么不是。

您的评论显示您正在使用mygengo-perl-new,但已将其安装在C:\\Perl\\lib\\MyGengo\\mygengo-api\\nheinric-mygengo-perl-new-ce194df\\mygengo 这是安装模块的不寻常位置。 编写模块的方式,它希望mygengo.pm位于@INC指定的目录之一。 然后客户端代码将其拉入

use mygengo;

我的建议是将mygengo.pmC:\\Perl\\lib\\MyGengo\\mygengo-api\\nheinric-mygengo-perl-new-ce194df\\mygengoC:\\Perl\\site\\lib

如果你使用mygengo作为你正在开发的另一个包的一部分,你可以将mygengo放在你的源代码树中,也许作为一个git子模块 别忘了添加use lib 'mygengo'; 如果你这样做的话。

有关完整的详细信息,请参阅有关require的perlfunc文档中的@INC搜索过程以及通过use模块额外语义

关于斜杠与反斜杠的一般建议

即使您的代码仅在Windows上运行,也更喜欢使用forward-slash作为硬编码路径中的分隔符。 反斜杠是Perl语言中的转义字符,所以你必须仔细考虑它。 在双引号字符串中,您必须记住转义转义字符以获得其普通含义, 例如

# 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命令shell将正斜杠视为引入选项和反斜杠作为路径分隔符。 如果你无法避免shell,那么你可能会被迫处理反斜杠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM