我正在与一些像下面这样的遗留 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"
构造在一个系统上正确解析为正确的包名称,但在另一个系统上没有。以下不同
print
运行时可以看到输出 has_sub_class
在两个不同的系统上:# 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
输出不一样!有任何想法吗 ?
最佳答案
更短的演示:
($x::, $x) = (1,2); print "$x::$x"
$ perl5.16.3 -e '($x::, $x) = (1,2); print "$x::$x"'
12
$ perl5.18.1 -e '($x::, $x) = (1,2); print "$x::$x"'
2::2
逐渐回暖。
$ perl5.16.3 -MO=Concise =e 'print "$x::$x"'
8 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
7 <@> print vK ->8
3 <0> pushmark s ->4
- <1> ex-stringify sK/1 ->7
- <0> ex-pushmark s ->4
6 <2> concat[t3] sK/2 ->7
- <1> ex-rv2sv sK/1 ->5
4 <#> gvsv[*x::] s ->5 <- $x::
- <1> ex-rv2sv sK/1 ->6
5 <#> gvsv[*x] s ->6 <- $x
-e syntax OK
$ perl5.18.1 -MO=Concise -e 'print "$x::$x"'
a <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
9 <@> print vK ->a
3 <0> pushmark s ->4
- <1> ex-stringify sK/1 ->9
- <0> ex-pushmark s ->4
8 <2> concat[t4] sKS/2 ->9
6 <2> concat[t2] sK/2 ->7
- <1> ex-rv2sv sK/1 ->5
4 <#> gvsv[*x] s ->5 <- $x
5 <$> const[PV "::"] s ->6 <- "::"
- <1> ex-rv2sv sK/1 ->8
7 <#> gvsv[*x] s ->8 <- $x
-e syntax OK
TL;博士。 v5.16 解析
"$x::$x"
如 $x:: . $x
. v5.18 为 $x . "::" . $x
.我在 delta docs 中没有看到任何明显提及此更改的内容。 ,但我会继续寻找。
关于使用包分隔符时的 perl 字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194556/