![](/img/trans.png)
[英]Running a batch file from Perl (Activestate perl in Windows)
[英]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/lib
和C:\\Perl\\lib
是同一目錄。
perlport文檔說明(強調添加)
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子模塊 。 別忘了添加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.