2010-08-13 122 views
9

我已經在我的MacBook Pro上通過CPAN安裝了模板模塊,並且它似乎正確安裝。Mac OS X中的兩個Perl版本?

但是,當我試圖運行一個腳本,其中包括模板模塊,我得到如下:

無法找到Template.pm在@公司(@公司包含:/用戶/ purinkle/Sites/rob/modules /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level/Library/Perl/Updates/5.10.0/System/Library/Perl/5.10.0/darwin-thread-multi- 2level /System/Library/Perl/5.10.0/Library/Perl/5.10.0/darwin-thread-multi-2level/Library/Perl/5.10.0/Network/Library/Perl/5.10.0/darwin-thread- multi-2level /Network/Library/Perl/5.10.0/Network/Library/Perl/System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level/System/Library/Perl/Extras/5.10。 0。)at ./index.pl line 12.

BEGIN失敗 - 編譯中止在./index.pl線12

然後我覺得這事一定是走了安裝過程中出錯,並嘗試通過CPAN重新安裝,但收到以下消息:

模板是最新的(2.22)。

我已經運行instmodsh命令來嘗試找到模塊的安裝位置。 instmodsh列出了這些目錄:

的/ opt/local/bin目錄

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

的/ opt/local/lib目錄/的perl5/SITE_PERL/5.8.9 /達爾文2level /模板

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Manual

的/ opt/local/lib目錄/ perl5/site_perl/5.8.9/darwin-2level/Template/Namespace

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Plugin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/藏匿

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tools

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/模板/教程

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS

/選擇/本地/共享/人/ MAN1

/選擇/本地/共享/人/ man3

它看起來像我有一些如何得到了兩個不同版本的Perl安裝(5.8.9和5.10.0),這導致了CPAN和其他Perl腳本之間的混淆。

我該如何驗證此問題以及如何解決此問題?

我跑的命令

which perl 
which cpan 

,他們都返回/選擇/ local/bin目錄

運行

find/-name perl 

回報

發現是:/ dev/fd/3:不是目錄

發現是:/ dev/FD/4:不是一個目錄

的/ opt/local/bin中/ perl的

/opt/local/etc/bash_completion.d/perl

的/ opt/local/var/macports/software/bash-completion/1.2_0/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/perl

/opt/local/var/macports/sources/rsync.macports.org/releas E /端口/ perl的

在/ usr/bin中/ perl的

在/ usr/local/bin中/ perl的

在/ usr /共享/文件/魔法/ perl的

find/-name cpan 

回報

的/ opt/local/bin目錄/ CPAN

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/cpan

/用戶/ purinkle /。 CPAN /編譯/ CPAN - 1.9402 - KtN827/BLIB /腳本/ CPAN

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/scripts/cpan

/Users/purinkle/.cpan/ build/CPAN-1.9402-zb0AeX/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/scripts/cpan

在/ usr/bin中/ CPAN

運行

perl -e 'print join "\n", @INC' 

回報

/用戶/ purinkle /網站/搶劫/模塊

/選擇/本地/ LIB /的perl5/SITE_PERL/5.8。9 /達爾文-2level

/opt/local/lib/perl5/site_perl/5.8.9

/選擇/本地/ LIB /的perl5/SITE_PERL

/選擇/本地/ LIB /的perl5/vendor_perl/5.8.9 /達爾文2level

/opt/local/lib/perl5/vendor_perl/5.8.9

的/ opt/local/lib目錄/ perl5的/ vendor_perl

/選擇/本地/ lib/perl5/5.8.9 /達爾文-2級

/opt/local/lib/perl5/5.8.9

+0

請看到我的編輯答案,也可以爲您發佈的perl的-e輸出「打印@INC \ n」 – ennuikiller 2010-08-13 19:52:12

回答

16

OS X附帶兩個版本的Perl。 5.10.0是默認值,因此/ usr/bin/perl和/ usr/bin/cpan應該都與5.10.0對話。

問題是你有三個。 /opt/local表示安裝了一個MacPorts,它可能在您未查找時安裝Perl作爲依賴項。這是/ opt/local/bin/perl,它可能是你路徑中的默認perl。請使用which perl進行檢查。這也意味着你可能使用MacPorts'cpan,請檢查which cpan,並將Template Toolkit安裝到MacPorts版本中。

我打算猜測你是在頂端運行一個#!/usr/bin/perl的程序,或者你正在使用內置的mod_perl,或者你是以一個不是你的用戶身份運行它。所有這些都將引用OS X的默認Perl,而不是MacPorts的安裝。

Macports有5.10和5.12,但Macports中的「perl」仍然是5.8。你可以在Macports上安裝5.10。

至於如何解決這個問題......如果您在該機器上使用mod_perl,請使用Macports的Perl。安裝模塊將會更容易,並且它會保持最新比操作系統版本更好。

爲了避免日後出現混淆,您可以將/usr/local/bin~/bin中的別名添加到您選擇的perl,perldoc和cpan。這會阻止其他人在您的路徑和劫持中安裝perl。

+0

這似乎是有道理的。如果我將腳本作爲「perl script.pl」運行,那麼它按預期方式運行,但只是將其作爲「./script.pl」運行,然後收到錯誤消息。我嘗試將shebang行更改爲「#!/ opt/local/bin/perl」,但我仍然可以得到相同的結果 – purinkle 2010-08-13 19:55:26

+6

@purinkle =>我用'#!/ usr/bin/env perl'開始我的腳本,通常給你你正在尋找的perl。 – 2010-08-13 20:18:11

+0

@Eric Storm =>謝謝!當我從命令行運行我的腳本時,這非常有效。現在看來,Apache是​​最後一個抱怨的人了。 – purinkle 2010-08-13 20:25:27

2

下手把這兩個命令:

which perl 
which cpan 

,如果你得到不同路徑的可執行文件,然後有一個很好的機會,你有2個版本或Perl安裝。如果它們是相同的,那麼很可能你的perl @INC配置不正確。您可以添加路徑@INC BNY包括這在腳本的最開始(的家當後):

BEGIN { 

     push @INC,"/path/to/cpan/modules"; 

     } 

在任何情況下做到這一點:

find/-name perl 
find/-name cpan 

看看你會得到什麼。這會告訴你是否有多個版本。

+0

這些命令都返回目錄「/ opt/local/bin」 – purinkle 2010-08-13 19:40:45

+0

請發佈perl -e的輸出「print @INC \ n」 – ennuikiller 2010-08-13 19:48:26

3

我在設置新MacBook Pro一個半月前經歷了這個過程。安裝MacPorts perl,切換到/usr/bin/env perl,更新我的PATH(從Schwern的回答中看來,這聽起來像是關於你現在的位置),這個過程很簡單明瞭,而且記錄合理。

搞清楚如何去Apache的PATH首先顯示了正確perl,在另一方面,是地獄和參與方式太多的谷歌搜索穿插着打我的頭撞在牆上救濟的時期。

所以,爲了避免這種情況,我最終發現的答案是,您需要添加一個PATH密鑰到/System/Library/LaunchDaemons/org.apache.httpd.plistPATH,您希望apache使用。假設你只是用的.plist格式,因爲我當時的陌生,這裏是我的完整電流org.apache.httpd.plist,這一直是我偉大的工作:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>Disabled</key> 
     <true/> 
     <key>Label</key> 
     <string>org.apache.httpd</string> 
     <key>ProgramArguments</key> 
     <array> 
       <string>/usr/sbin/httpd</string> 
       <string>-D</string> 
       <string>FOREGROUND</string> 
     </array> 
     <key>OnDemand</key> 
     <false/> 
     <key>SHAuthorizationRight</key> 
     <string>system.preferences</string> 
     <key>EnvironmentVariables</key> 
     <dict> 
       <key>PATH</key> 
       <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string> 
     </dict> 
</dict> 
</plist> 

複製/粘貼到您的系統(或只需將EnvironmentVariables密鑰及其相應的字典添加到您現有的文件中),重新啓動apache,並且應該設置。 (除非我誤解,這是其他的東西,實際上它爲我工作,但我很確定這是它。)

3

還有另一種解決方案,在我看來更簡單:只需安裝另一個副本Perl模塊,並將其安裝到要使用它的安裝中。例如,如果您的系統上安裝了兩個Perl安裝程序,一個位於/ usr/bin,另一個位於/ opt/local/bin,默認情況下您的cpan命令會將該模塊安裝到/ opt/local/bin安裝中,但您的應用程序(Apache或其他)正在尋找/ usr/bin安裝中的模塊,那麼在安裝模塊時只需要將cpan調用爲「/ usr/bin/cpan」即可。這可以解決問題,無需編輯腳本或Apache配置等。

+0

這是我唯一的工作。謝謝。 – joarderm 2016-08-24 01:30:05

1

我遇到了類似的問題;在我的情況下,問題是我一直在運行cpan而不是root,所以它只是在我的用戶目錄中安裝cpan模塊,全局的@INC並沒有包含這些模塊。只需運行'sudo cpan'而不是'cpan',安裝你的模塊,並且它們應該很好地加載。

0

我有同樣的問題,不知道它是如何發生的。我懷疑它在XCode更新期間發生了某種情況。我通過手動在我的Mac上重新安裝Perl來解決此問題。我用的是最新版本如下所述:

http://search.cpan.org/~shay/perl/README.macosx

curl -O http://www.cpan.org/src/perl-5.26.1.tar.gz 
    tar -xzf perl-5.26.1.tar.gz 
    cd perl-5.26.1 
    ./Configure -des -Dprefix=/usr/local/ 
    make 
    make test 
    sudo make install