使用包分隔符时的 perl 字符串插值

标签 perl

我正在与一些像下面这样的遗留 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/

相关文章:

perl - 如何使用 Perl 或 shell 以非递归方式迁移目录?

perl - 错误 "Use of uninitialized value in string ne"来自哪里?

xml - Perl XML::LibXML 与 SOAP::SOM

javascript - 无法在 Perl 脚本中使用 selenium 远程驱动程序从下拉列表中选择选项

arrays - 将数组分配给哈希子键

perl - 仅当文件尚未打开时,如何才能在 Perl 中打开它?

Perl:为什么不应该使用 "last"退出 grep 或映射?

python - 是否有与 Python 的 re.findall/re.finditer(迭代正则表达式结果)等效的 Perl?

Linux LVM lvs 命令从 cron perl 脚本失败但直接从 cron 运行

regex - 我如何知道 Perl 正则表达式的哪一部分与字符串匹配?