我正在使用带有Komodo Edit的ActiveState perl。 我收到以下错误。
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
目录。
答案 0 :(得分:4)
就Windows而言,C:/Perl/lib
和C:\Perl\lib
是同一目录。
perlport documentation注释(强调添加)
DOS和衍生物
Perl长期以来一直被移植到运行在PC-DOS,MS-DOS,OS / 2等系统下的英特尔式微型计算机,以及大多数Windows平台,你可以自己提一下(除了Windows CE,如果算上的话) 。熟悉
COMMAND.COM
或CMD.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.pm
从C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengo
移至C:\Perl\site\lib
。
如果您正在使用mygengo作为另一个正在开发的软件包的一部分,那么您可以将mygengo
放在源代码树中,也许作为git submodule。如果你这样做,别忘了添加use lib 'mygengo';
。
有关详细信息,请参阅require
和@INC
search process上perlfunc文档中的extra semantics for modules via 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,那么你可能会被迫处理反斜杠。