2010-08-13 124 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