如何在macOS 10.13 High Sierra上安装Perl

12
我最近升级到macOS 10.13 High Sierra,不久之后尝试安装更新版本的Perl(5.26.1)时遇到问题。问题的主要原因是在macOS 10.13 High Sierra(家用笔记本电脑)上的自测始终失败,但在macOS 10.12 Sierra(工作笔记本电脑)上成功。
以下是安装日志中显示失败的部分内容:
../cpan/Config-Perl-V/t/30_plv5240.t ............................... ok
../cpan/Config-Perl-V/t/31_plv52511.t .............................. ok
../cpan/DB_File/t/db-btree.t ....................................... ok
Use of uninitialized value $value in string eq at t/db-hash.t line 224.
Use of uninitialized value $values[0] in string eq at t/db-hash.t line 224.
Use of uninitialized value $value in lc at t/db-hash.t line 224.
Use of uninitialized value $h{""} in string eq at t/db-hash.t line 243.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value in numeric eq (==) at t/db-hash.t line 252.
Use of uninitialized value $foo[18] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[36] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[48] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[58] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[59] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[60] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[62] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[63] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[92] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[114] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[140] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[187] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[188] in join or string at t/db-hash.t line 261.
Use of uninitialized value $foo[189] in join or string at t/db-hash.t line 261.
Use of uninitialized value $h{"Fred"} in string eq at t/db-hash.t line 572.
Use of uninitialized value $v in concatenation (.) or string at t/db-hash.t line 748.
../cpan/DB_File/t/db-hash.t ........................................ 
Dubious, test returned 2 (wstat 512, 0x200)
Failed 76/166 subtests 

我无论是使用 perlbrew install perl-5.26.1 安装还是手动下载 Perl tarfile 进行安装,都会出现同样的错误。当我尝试调试问题测试文件 t/db-hash.t 时,我可以看到测试哈希表 %h 被创建并在测试文件中进行了填充,但是当我执行 print Dumper(\%h) 时,我发现哈希表似乎具有正确的键,但是所有的值都是 undef,而不是在测试脚本中分配的值。

这些 undef 值导致了测试失败。奇怪的是,当我打印整个哈希表或尝试制作哈希表值的数组时,未定义的值会出现。如果我要求特定哈希键的值,例如 my $value = $h{key},则该值会正常打印。

问题:

  • 如何修复此问题以便在 macOS 10.13 上安装新版 Perl?
  • 出了什么问题?这在 macOS 10.12 上曾经可行。
2个回答

13

简述

以下是有效的方法:

  1. Install Berkeley DB. I use Homebrew, but you can get the source files at the Oracle site.

    brew install berkeley-db
    
  2. Install Perl. I use Perlbrew, but you can get the source files at the Perl site.

    perlbrew install perl-5.26.1
    

部分解释

回顾安装失败的日志,可以在DB_File部分附近找到一个警告,这是一个线索:

...
./miniperl -Ilib make_ext.pl lib/auto/DB_File/DB_File.bundle  MAKE="/Applications/Xcode.app/Contents/Developer/usr/bin/make" LIBPERL_A=libperl.a LINKTYPE=dynamic
Parsing config.in...
Looks Good.
Warning (mostly harmless): No library found for -ldb
Generating a Unix-style Makefile
Writing Makefile for DB_File
...

未找到db库,大多数情况下是无害的。

根据DB_File模块的文档,它是一个允许Perl程序使用Berkeley DB提供的功能的模块...

... 一个模块,允许Perl程序使用Berkeley DB提供的功能...

安装了berkeley-db之后,Perl安装日志中的同一部分不再显示相同的警告:

...
./miniperl -Ilib make_ext.pl lib/auto/DB_File/DB_File.bundle  MAKE="/Applications/Xcode.app/Contents/Developer/usr/bin/make" LIBPERL_A=libperl.a LINKTYPE=dynamic
Parsing config.in...
Looks Good.
Generating a Unix-style Makefile
Writing Makefile for DB_File
...

在接下来的过程中,之前失败的测试已经通过,使得安装成功完成:

...
../cpan/DB_File/t/db-btree.t ....................................... ok
../cpan/DB_File/t/db-hash.t ........................................ ok
../cpan/DB_File/t/db-recno.t ....................................... ok
...

我在网上没有找到关于为什么伯克利数据库(Berkeley DB)似乎在macOS 10.13 High Sierra中缺失的任何文档,也不知道这是否与之前的macOS版本有所不同。

非常感谢Tim D帮助我进行故障排除。


1
最好在rt.perl.org上报告这个问题。当libdb未安装时,“mostly harmless”需要更改! - RickMeasham
谢谢您的建议@RickMeasham。我会这样做的。 - Jamin Kortegard
1
使用 perlbug 提交了错误报告。FYI @RickMeasham。 - Jamin Kortegard

2
要安装包含DB_File模块的perl本身,或从CPAN安装DB_File模块,解决方法相同:编辑其config.in文件,将其指向正确的berkeley-db位置。
例如,我已经通过macports安装了db48软件包,并使用sudo port install db48命令进行了安装。在perl下载中,我进入cpan/DB_File目录,编辑其config.in文件,将现有的INCLUDE和LIB赋值更改如下:
INCLUDE    = /opt/local/include/db48
LIB        = /opt/local/lib/db48

我可以恢复perl的构建过程,DB_File可以编译。

参考资料:

Perl RT#133280
CPAN RT#125238


虽然我认为这是一般有用的信息,但它并不能解决我的问题。问题在于系统完全缺少berkeley-db库,而不是在Perl安装配置期间找不到它。 - Jamin Kortegard
1
也许我没有表达清楚:解决方案的一部分是安装berkeley-db(例如通过macports或homebrew),然后告诉perl的DB_File在哪里找到它,因为它的config.in指向了错误的位置。 - Ether

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接