升级到OS 10.10后,我不得不再次安装所有以前使用过的perl模块。没问题。我想。
OS 10.10上的Perl是"这是针对darwin-thread-multi-2level"构建的perl 5,版本16,subversion 3(v5.16.3)。 (来自perl --version)。 @INC看起来像是(尝试perl -e' print join(" \ n",@ INC);'或perl -V):
/opt/local/lib/perl5/site_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/site_perl/5.16.3 /opt/local/lib/perl5/vendor_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/vendor_perl/5.16.3 /opt/local/lib/perl5/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/5.16.3 的/ opt / local / lib目录/ perl5的/ SITE_PERL 的/ opt / local / lib目录/的perl5 / vendor_perl
当我尝试使用未知模块时,perl抛出: "无法在@INC中找到Mymodule.pm ...然后:@INC包含:... / Library /Perl /5.18 / Darwin-thread_multi-2level / Library /Perl / 5.18 /网络/库/ Perl / 5.18 / darwin-thread-multi-2level /Network/Library/Perl/5.18和所有其他已知的(并添加了5.18 perl.pm文件夹)。 每个perl dev都知道这条消息。 但字面意思是:@INC显然链接到5.18文件夹!乍一看我应该使用Perl 5.18。
我从Macports安装了我的第一批新模块。 5.18端口文件。并将新模块pathes添加到列表/Library/Perl/5.18/AppendToPath中。工作得很好。 但是当我用cpan安装了一个模块 - 在Macports中不能用作5.18时,我遇到了麻烦。该模块使用5.16编译(当然,见上文),并且未被AppendToPath文件中的其他路径接受。 Dynaloader不匹配。
我不知道@INC列表在运行时被更改的位置。在早期的Mac OS 10版本中,新的@INC包含相同的版本模块版本。即一个活动的perl 5.14也包括5.14模块,5.12包括5.12 pathes a.s.o. 为什么Yosemite上的perl 5.16包含5.18模块pathes?
在我的帖子后添加一些混淆: 当我在程序代码中尝试打印$ ^ V时,我得到5.18。 这意味着,你没有得到你想要的东西。可能是我的shebang#!/ usr / bin / perl从5.18开始而不是5.16。
答案 0 :(得分:4)
经验丰富的Perl开发人员会告诉您忽略系统perl。如果您升级它,对于您需要的错误修正,您将面临破坏操作系统的风险。如果升级操作系统,修改后的系统perl可能会破坏您的代码。
Macports和自制软件都很棒,但对Perl来说并不理想。我从PATH甚至我的系统中清除/ opt / local / version。
帮自己一个大忙。使用Xcode
安装Command Line Tools
。安装perlbrew
。卷起你自己的perl。哎呀,卷起你自己的6个perls,在它们之间来回跳跃。在需要时保留一个线程版本。保持非线程的速度。最重要的是,每当您更改所使用的版本时,perlbrew都会为您正确更新您的环境。没有大惊小怪,没有麻烦。
答案 1 :(得分:3)
<强>解决强>
OS Yosemite作为Maverick的更新提供了perl 5.16 和 5.18。
在测试which perl
时,您将获得/opt/local/bin/perl
,这是/opt/local/bin/perl5.16
的符号链接。
当你在perl程序中使用#!/usr/bin/perl
作为标准shebang(可移植到Linux)时,你将使用另一个perl版本运行该程序,因为#!/usr/bin/perl
确实存在为版本5.18的二进制文件。 / p>
当您使用cpan / cpanm(cpanminus)轻松快速地安装新模块时,您将获得编译为5.16版本的模块。因为这被假定为标准路径/版本(见上文)。
您会在cpanm
找到/opt/local/libexec/perl5.16/sitebin/
您还会找到/opt/local/libexec/perl5.18/
但没有sitebin且没有cpanm。
现在:
在sitebin
中创建文件夹/opt/local/libexec/perl5.18/
并将文件/opt/local/libexec/perl5.16/sitebin/cpanm
复制到/opt/local/libexec/perl5.18/sitebin/
(使用sudo ...获取权限)。
cpanm是一个普通的perl程序文件,独立于版本 - 但是看看这个文件的shebang!打开文件并编辑
中的前两行#!/opt/local/bin/perl5.16
eval 'exec /opt/local/bin/perl5.16 -S $0 ${1+"$@"}'
到
#!/opt/local/bin/perl5.18
eval 'exec /opt/local/bin/perl5.18 -S $0 ${1+"$@"}'
这意味着:只需将5.16更改为5.18即可。就是这样。
现在您可以使用这个新的cpanm安装新模块。
新的cpanm将在/opt/local/lib/perl5/site_perl/5.18/darwin-thread-multi-2level/
中部署模块。要让新路径知道Mac上的perl 5.18,请编辑文件/Library/perl/5.18/AppendToPath
并添加一个带/opt/local/lib/perl5/site_perl/5.18/darwin-thread-multi-2level
的新行(末尾没有斜线)。
就是这样。