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

时间:2012-05-26 10:02:03

标签: windows perl activeperl activestate

我正在使用带有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目录。

1 个答案:

答案 0 :(得分:4)

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

perlport documentation注释(强调添加)

  

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\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,那么你可能会被迫处理反斜杠。