【问题标题】:Perl: Can't use 'defined(%hash)'Perl: 不能使用 'defined(%hash)'
【发布时间】:2019-11-13 13:44:53
【问题描述】:

在 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 个 macport 包安装了 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_HTMLdirectory 中生成所有 HTML 文件。只是缺少电子邮件的日期,我将进行研究以添加此信息。

【问题讨论】:

  • 尝试将所有defined(%variable_name) 替换为%variable_name
  • defined(%hash) 自 5.22 ( perlmonks.org/?node_id=1225431 ) 以来是致命的,因此 5.18 可能有效。不幸的是,我没有 Mac,但您可以尝试 export PATH=/usr/bin:$PATH 看看发生了什么。如果这样做,还请尝试取消设置以 PERL 开头的所有环境变量。

标签: html perl file-conversion eml


【解决方案1】:

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 来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2010-11-30
    • 2012-04-19
    相关资源
    最近更新 更多