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

oxalkeyp  于 2023-04-21  发布在  Perl
关注(0)|答案(7)|浏览(298)

我已经通过CPAN在我的MacBook Pro上安装了模板模块,它似乎安装正确。
但是,当我尝试运行一个包含Template模块的脚本时,我得到以下结果:
在@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.plline 12.
开始失败--编译在./index.pl第12行中止。
然后我认为在安装过程中一定出了问题,并尝试通过CPAN再次安装,但收到以下消息:
模板是最新的(2.22)。
然后我运行instmodsh命令来尝试查找模块的安装位置。instmodsh列出了以下目录:
/opt/local/bin
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template/Manual
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template/Namespace
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template/Plugin
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template/Stash
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/Template/Tools
/opt/local/lib/perl 5/site_perl/5.8.9/达尔文-2level/模板/教程
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-2level/auto/Template/Stash/XS
/opt/local/share/man/man1
/opt/local/share/man/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/bin/Perl
/usr/local/bin/perl
/usr/share/file/magic/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/bin/cpan
跑步

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

退货
/用户/purinkle/站点/rob/模块
/opt/local/lib/perl5/site_perl/5.8.9/达尔文-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/达尔文-2level
/opt/local/lib/perl5/vendor_perl/5.8.9
/opt/local/lib/perl5/vendorperl
/opt/local/lib/perl5/5.8.9/达尔文-2level
/opt/local/lib/perl5/5.8.9

4sup72z8

4sup72z81#

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。
至于如何解决这个问题...如果你在那台机器上使用的是using mod_perl,请使用Macports的Perl。安装模块会更容易,而且它会比操作系统版本更好地保持最新状态。
为了避免将来的混乱,你可以在/usr/local/bin~/bin中添加别名到perl,在perldoc和cpan中添加别名到你选择的Perl。这将防止其他人在你的路径中安装perl并劫持。

u2nhd7ah

u2nhd7ah2#

还有另一个解决方案,在我看来要简单得多:只需安装Perl模块的另一个副本,并将其安装到您想要使用它的安装中。例如,如果您的系统上有两个Perl安装,一个在/usr/bin中,另一个在/opt/local/bin中,并且您的cpan命令默认将模块安装到/opt/local/bin安装中,但您的应用程序(Apache或其他)在/usr/bin安装中查找模块,那么在安装模块时只需以“/usr/bin/cpan”的形式调用cpan即可。这样就解决了这个问题,而无需编辑脚本或Apache配置等。

neskvpey

neskvpey3#

大约一个半月前,我在安装新的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,你就应该设置好了(除非我记错了,它实际上是为我工作的其他东西,但我很确定这就是它)。

oyt4ldly

oyt4ldly4#

从这两个命令开始:

which perl
which cpan

如果你得到不同的路径到可执行文件,那么有一个很好的机会,你有2个版本或perl安装。如果他们是相同的,那么你有机会有perl @INC配置不正确。你可以添加路径到@INC bny包括在你的脚本的最开始(后shebang):

BEGIN {

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

        }

在任何情况下,请执行以下操作:

find / -name perl
find / -name cpan

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

nfs0ujit

nfs0ujit5#

我遇到了类似的问题;在我的例子中,问题是我一直在以自己的身份而不是以root身份运行cpan,所以它只在我的用户目录中安装cpan模块,而global @INC没有包括。只需运行'sudo cpan'而不是'cpan',安装您的模块,它们应该会被加载。

mftmpeh8

mftmpeh86#

我也遇到了同样的问题,不知道它是怎么发生的。我怀疑它是在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
7lrncoxx

7lrncoxx7#

最好的建议是安装你自己完全控制的Perl。你不希望系统为你改变Perl,潜在地导致二进制与模块不兼容等等。其他答案已经涵盖了这类东西。
但是,每次我回答类似的问题时,我都必须记住macOS使用的正确变量,所以这里又是这个答案。
macOS分发了自己的“perl”,实际上是两个perl。我已经编译了perl versions for each version of macOS的列表。
其中一个perls是默认的(通常是macOS上一个主要版本的更高版本)。
由于VERSIONER_PERL_VERSION中没有值,macOS使用较低版本的perl。Ventura分发了perls v5.30.3和v5.34.0,因此默认值为v5.30.3:

brian@M1-Mini ~ % unset VERSIONER_PERL_VERSION
brian@M1-Mini ~ % /usr/bin/perl -v

This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

我可以将VERSIONER_PERL_VERSION设置为更高的版本来获得:

brian@M1-Mini ~ % export VERSIONER_PERL_VERSION=5.34
brian@M1-Mini ~ % /usr/bin/perl -v

This is perl 5, version 34, subversion 0 (v5.34.0) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

如果没有值,则返回到低版本,而不是之前选择的版本:

brian@M1-Mini ~ % unset VERSIONER_PERL_VERSION
brian@M1-Mini ~ % /usr/bin/perl -v

This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

而且,如果我设置的版本不对应于分布式版本,我将获得默认版本:

brian@M1-Mini ~ % export VERSIONER_PERL_VERSION=5.45
brian@M1-Mini ~ % /usr/bin/perl -v
perl: VERSIONER_PERL_VERSION environment variable error (ignored)

This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

相关问题