我已经在我的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
答案 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