Dad*_*ada 6
问题来自于线
'type' => $_[0]->{'name'},
$_[0]
指封闭子例程的第一个参数(从 开始'<>' => sub {
)。根据Getopt::Long 的<>
option的文档,这个子例程在命令行的每个非选项参数中调用一次,这个“非选项参数”作为它的单个参数。如果您use Data::Dumper; print Dumper \@_;
在此子例程的开头添加,您将获得以下输出:
$VAR1 = [
'dbspace'
];
因此,$_[0]
是字符串"dbspace"
,而不是哈希引用。做$_[0]->{'name'}
是没有意义的。相反,您可能只想使用$_[0]
:
push @checks, {
'type' => $_[0],
...
请参阅@shawn 的回答以了解为什么更新 Perl 会破坏您的脚本。
Sha*_*awn 6
@Dada 描述了这个问题,但是您看到相同的代码在旧版本上工作并且在新版本上失败,这是不寻常的 - 为什么它在旧设置上也没有失败?原因如下:
在Getopt::Long
2.37 版本中,在参数处理程序中传递给回调函数的参数从纯字符串更改为对象(在本例中为祝福的 hashref),其字段包括name
. 然而,在 2.39...
<>
在将参数传递给其他模块(例如Archive::Tar
.<>
恢复更改,因为对象的添加功能与回调函数并不真正相关。
因此,您的旧安装必须使用 2.37 或 2.38 版本,其中提供的访问名称字段的代码工作正常。2.39 或更高版本会破坏它(与 2.36 或更高版本一样)。
更多推荐
字符串,Perl,HASH,XXX
发布评论