簡體   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