Perl:无法使用 'defined(%hash)'

Perl: Can't use 'defined(%hash)'

在 MacOS 10.13.6 High Sierra 上,我想将以 eml 格式文件(使用 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 和以下 3 个 macports 软件包安装了 perl5.26 和 perl5.28 :

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 的建议:我替换了所有 all defined(%variable_name) by just %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 文件。只是缺少电子邮件的日期,我将进行研究以添加此信息。

Perl v5.6.1 弃用了在集合上使用 defined,但许多东西已被弃用并留在那里。然后,很久以后,Perl 开发人员开始处理这些弃用问题。 Perl v5.16 开始对此发出警告,v5.22 终于让它变得致命。

幸运的是,您安装了 v5.18 /usr/bin/perl(系统 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

但是,请注意 Apple 已承诺 not distributing scripting language runtimes。到目前为止,他们还没有关闭它,但最终你将不得不使用你自己安装的 perl 来解决这个问题。