Perl:无法使用“defined(%hash)”

3
在MacOS 10.13.6 High Sierra系统中,我想要将我通过Thunderbird导出的一组邮件转换成HTML格式的文件。为此,我已经安装了一个名为“mhonarc”的工具。但是在执行时,当我输入以下命令:
mhonarc -outdir /Users/peter/Mails_HTML /Users/peter/Mails

我遇到了以下错误:
Can't use 'defined(%hash)' (Maybe you should just omit the   defined()?) at /opt/local/lib/perl5/vendor_perl/5.28/darwin-thread-multi-2level/mhamain.pl line 1565.
Compilation failed in require at /opt/local/bin/mhonarc line 39.

我不确定我是否拥有正确的Perl版本。我已经通过macports安装了perl5.26和perl5.28以及以下3个macports包:

p5-mhonarc @2.6.19 (perl)
MHonArc - mail and news munging

p5.26-mhonarc @2.6.19 (perl)
MHonArc - mail and news munging

p5.28-mhonarc @2.6.19 (perl)
MHonArc - mail and news munging

在执行了sudo port searc mhonarc之后:

我认为 High Sierra 自带的 Perl 和使用macports安装的 Perl 包之间存在冲突,但我不确定。

编辑1

如果我执行which perl,我得到:/opt/local/bin/perl,因此我推断我正在使用从macports安装的版本。

这里是mhonarc安装的版本和可能使用的版本:

$ /opt/local/bin/perl --version

This is perl 5, version 26, subversion 3 (v5.26.3) built for darwin-  thread-multi-2level

Copyright 1987-2018, Larry Wall

并且

$ /usr/bin/perl --version

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

Copyright 1987-2013, Larry Wall

编辑2

我按照@choroba的建议进行了更改:我用%variable_name替换了所有的 all defined(%variable_name)

所以命令mhonarc -outdir /Users/peter/Mails_HTML /Users/peter/Mails不再产生错误,但问题现在是它没有在目录/Users/peter/Mails_HTML下生成任何邮件的HTML格式。

我得到了以下输出:

This is MHonArc v2.6.19, Perl 5.028002 darwin
Converting messages to /Users/peter/Mails_HTML/
Reading /Users/peter/Mails 

Writing mail 
Writing /Users/peter/Mails_HTML//maillist.html ...
Writing /Users/peter/Mails_HTML//threads.html ...
Writing database ...
0 total messages

这种行为的起源是什么?

编辑3

问题最终通过修改命令行来解决:

mhonarc -outdir /Users/peter/Mails_HTML /Users/peter/Mails/*

这将在/Users/peter/Mails_HTML目录中生成所有HTML文件。只有电子邮件日期缺失,我将研究添加此信息。


1
尝试将所有的 defined(%variable_name) 替换为 %variable_name - choroba
1
defined(%hash) 自 5.22 版本以后是致命的错误(https://www.perlmonks.org/?node_id=1225431),所以 5.18 可能会起作用。不幸的是我没有 Mac,但您可以尝试 export PATH=/usr/bin:$PATH 然后看看发生了什么。如果您这样做,请尝试取消设置任何以 PERL 开头的环境变量。 - cxw
1个回答

1
Perl v5.6.1不建议在集合上使用defined,但许多东西已被弃用并保留了下来。后来,Perl开发人员开始处理这些弃用内容。Perl v5.16开始警告这一点,而v5.22最终使其致命化。
幸运的是,您安装了v5.18作为系统/usr/bin/perl,因此可以使用它。但是,请注意,您正在使用v5.18,因为macOS系统perl实际上有两个不同的版本(有时请尝试使用strings)。
$ ls /usr/bin/perl5*
/usr/bin/perl5.18   /usr/bin/perl5.28

默认情况下,我使用早期版本的(支持但警告defined %hash)。这样,macOS系统可以使用早期的perl,他们有足够长的时间来测试和稳定它。

$ /usr/bin/perl -v

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

但是,作为用户,我可以告诉perl我想要哪个版本:

$ env VERSIONER_PERL_VERSION=5.28 /usr/bin/perl -v

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

我还可以选择一个默认的用户进程(而不是系统进程):

$ defaults write com.apple.versioner.perl Version 5.28

$ defaults read com.apple.versioner.perl Version
5.28

但是请注意,苹果公司已承诺不再分发脚本语言运行时。目前他们还没有关闭这个功能,但最终你将需要自己安装perl来解决这个问题。


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