Mac OS X中有两个版本的Perl?

时间:2010-08-13 19:32:44

标签: perl macos templates osx-snow-leopard cpan

我已经在我的MacBook Pro上通过CPAN安装了模板模块,它似乎安装正确。

但是,当我尝试运行包含模块模块的脚本时,我得到以下内容:

  

无法在@INC中找到Template.pm(@INC包含:/ Users / 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第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/darwin-2level/Template

     

/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/Stash

     

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

     

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

     

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

     

的/ opt /本地/共享/人/ MAN1

     

的/ opt /本地/共享/人/ man3

看起来我有一些如何安装两个不同版本的Perl(5.8.9和5.10.0),这导致CPAN和其他Perl脚本之间的混淆。

如何验证此问题以及如何解决此问题?

我已经运行了命令

which perl
which cpan

他们都返回/ opt / local / bin

运行

find / -name perl

返回

  

find:/ dev / fd / 3:不是目录

     

find:/ 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/release/ports/perl

     

的/ usr /斌/ 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

     

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/blib/script/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 /斌/ CPAN

运行

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

返回

  

/用户/ purinkle /站点/抢劫/模块

     

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

     

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

     

的/ opt / local / lib目录/的perl5 / SITE_PERL

     

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

     

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

     

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

     

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

     

/opt/local/lib/perl5/5.8.9

6 个答案:

答案 0 :(得分: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。这将阻止其他东西在您的路径中安装perl并劫持。

答案 1 :(得分:3)

大约一个半月前,我在设置新的MacBook Pro时经历了这个过程。安装了MacPorts perl,切换到/usr/bin/env perl,并更新了我的PATH(根据Schwern的回答,听起来就像你现在的位置一样)很简单,并且记录得很清楚。

另一方面,弄清楚如何让正确的perl首先出现在apache的PATH中,这是一种地狱般的,并且涉及的方式过多的谷歌搜索穿插着句号把头靠在墙上救济。

所以,为了省去你,我最终找到的答案是你需要向PATH添加一个/System/Library/LaunchDaemons/org.apache.httpd.plist密钥和你希望apache使用的PATH。假设你和我当时一样不熟悉.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密钥及其附带的dict添加到现有文件中),重新启动apache,然后设置。 (除非我记错了,其他的东西实际上让它适合我,但我很确定这就是它。)

答案 2 :(得分:3)

另一种解决方案在我看来要简单得多:只需安装Perl模块的另一个副本,然后将其安装到要使用它的安装中。例如,如果您的系统上有两个Perl安装,一个在/ usr / bin中,另一个在/ opt / local / bin中,并且您的cpan命令默认将模块安装到/ opt / local / bin安装中,但是app(Apache或其他)正在/ usr / bin安装中寻找模块,然后你需要在安装模块时调用cpan作为“/ usr / bin / cpan”。这解决了问题,无需编辑脚本或Apache配置等。

答案 3 :(得分:2)

从这两个命令开始:

which perl
which cpan

如果您获得可执行文件的不同路径,那么您很可能安装了2个版本或perl。如果它们是相同的,那么你可能错误地配置了perl @INC。您可以在脚本的最开头(shebang之后)添加@INC bny的路径,包括:...

BEGIN {

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

        }  

无论如何要这样做:

find / -name perl
find / -name cpan

看看你得到了什么。这将告诉您是否有多个版本。

答案 4 :(得分:1)

我遇到了类似的问题;在我的情况下,问题是我一直在运行cpan而不是root用户,所以它只是在我的用户目录中安装cpan模块,而全局@INC并没有包含这些模块。跑步&#39; sudo cpan&#39;而不是&#39; cpan&#39;,安装你的模块,它们应该装得很好。

答案 5 :(得分: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