1

我将 ActiveState perl 与 Komodo Edit 一起使用。我收到以下错误。

在 @INC 中找不到 MyGengo.pm(@INC 包含: C:/Perl/site/lib C:/Perl/lib 。)
在 D:\oDesk\MyGengo Integration\sample 第 6 行。

为什么解释器在寻找C:/Perl/lib而不是C:\Perl\lib?难道它不知道它是 Windows 而不是 Linux?

编辑

.pm我通过复制目录中的文件解决了这个问题C:\Perl\lib。我认为,这个问题是因为这个模块是手动下载的。PPM install 会将.pm文件复制到lib目录中。

4

1 回答 1

4

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

perlport文档说明(已添加重点)

DOS 及其衍生产品

Perl 长期以来一直被移植到运行在诸如 PC-DOS、MS-DOS、OS/2 和大多数 Windows 平台(如果你算上 Windows CE 除外)等系统下运行的 Intel 风格的微型计算机上。熟悉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位于名为 in 的目录之一中@INC。客户端代码然后将其拉入

use mygengo;

我的建议是从mygengo.pm移动C:\Perl\lib\MyGengo\mygengo-api\nheinric-mygengo-perl-new-ce194df\mygengoC:\Perl\site\lib.

作为替代方案,如果您将 mygengo 用作您正在开发的另一个包的一部分,您可以mygengo放入源代码树中,也许作为git submoduleuse lib 'mygengo';如果您这样做,请不要忘记添加。

有关完整的详细信息,请阅读perlfunc 文档中的@INC搜索过程require以及通过use.

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

即使您的代码仅在 Windows 上运行,也更喜欢在硬编码路径中使用正斜杠作为分隔符。反斜杠是 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\';

现在你有一个语法错误。

在 dirstuff 行 n 的 EOF 之前的任何地方都找不到字符串终止符“'”。

您可能希望将另一个值插入到$dir.

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

哦,是的,您需要双引号进行插值。

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

摸头调试后

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

因此,反斜杠更容易出错并且对维护很麻烦。正斜杠是单引号和双引号字符串中的普通字符,因此它几乎总是意味着您所期望的。

正如perlport 所指出的,Windows 命令外壳将正斜杠视为引入选项,将反斜杠视为路径分隔符。如果您无法避免使用 shell,那么您可能会被迫处理反斜杠。

于 2012-05-26T11:25:59.453 回答