【发布时间】:2015-05-12 14:56:49
【问题描述】:
我正在与一些遗留的 perl 作斗争,如下所示:
sub UNIVERSAL::has_sub_class {
my ($package,$class) = @_;
my $all = all_packages();
print "$package - $class", "\n";
print "$package::$class", "\n";
return exists $all->{"$package::$class"};
}
在两个不同的系统、两个不同的 PERL 安装/版本上,此代码的行为不同,即 "$package::$class" 构造在一个系统上被正确解析为正确的包名称,但在另一个系统上却没有。
在两个不同的系统上运行has_sub_class 时可以看到以下不同的print 输出:
# print output on system 1 (perl v5.8.6):
webmars::parameter=HASH(0xee93d0) - webmars::parameter::date
webmars::parameter::date
# print output on system 2 (perl v5.18.1):
webmars::parameter=HASH(0x251c500) - webmars::parameter::date
webmars::parameter=HASH(0x251c500)::webmars::parameter::date
您知道在 perl v5.8.6 和 perl v5.18.1 之间是否有任何字符串插值更改可能导致这种行为?或者我应该去别的地方看看?我真的尝试过用谷歌搜索并阅读 perl 更改说明,但找不到任何感兴趣的内容。
由于我对 perl 的了解有限,我尝试获取可以重现我遇到的问题的最小代码段。我想出了以下我希望是相关的:
# system 1 (perl v5.8.6):
$ perl -e 'my %x=(),$x=bless(\%x),$y='bar';print "$x::$y\n";'
bar
# system 2 (perl v5.18.1):
$ perl -e 'my %x=(),$x=bless(\%x),$y='bar';print "$x::$y\n";'
main=HASH(0xec0ce0)::bar
输出不同!有什么想法吗?
【问题讨论】:
-
perl -Mstrict -we 'my %x=(),$x=bless(\%x),$y='bar';print "$x::$y\n";' -
很容易成为在发布之间的 6 年内修复的错误 :)。但是这样简洁的 MCVE 做得很好!
标签: perl