为什么这两个变量`$ {$ :: {“ _ <$ filename”}}}和`$ {“ :: _ <$ filename”}`不相等?

时间:2019-05-23 10:39:34

标签: perl perl-globs

此问题属于thisthis

@ikegami说:


我们已经确定,以下代码将返回名称/由"_<$filename"产生的根/主命名空间中的符号的全局名称

$::{ "_<$filename" }

我们还确定以下内容引用了由"_<$filename"产生的根/主体中的标量:

${ $::{ "_<$filename" } }

最后,我们还确定了以下是引用相同标量的符号引用:

${ "::_<$filename" }

在调试我的应用程序时,我在调试器上编写下一个代码:

DB::say "EXISTS";
defined ${ 'main::' }{ "_<$filename" }? DB::say "YES" : DB::say "NO";
defined ${ "::_<$filename" }? DB::say "YES" : DB::say "NO";
if( ${ 'main::' }{ "_<$filename" } ne ${ "::_<$filename" } ) {
    print "MISMATCH\n";
    print "$filename\n";
    print ${ 'main::' }{ "_<$filename" }, "\n",
        defined ${ 'main::' }{ "_<$filename" }, "\n",
        ${ "::_<$filename" }, "\n",
        defined ${ "::_<$filename" }, "\n";
    Devel::Peek::Dump( ${ ${ 'main::' }{ "_<$filename" } } );
    Devel::Peek::Dump( ${       "::_<$filename"  } );
    Devel::Peek::Dump( ${     $::{"_<$filename"} } );
    Devel::Peek::Dump( ${ ${'::'}{"_<$filename"} } );
}

输出为:

EXISTS
YES
NO
MISMATCH
Specio::Constraint::Simple->_optimized_constraint
*main::_<Specio::Constraint::Simple->_optimized_constraint
1


SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51
SV = PV(0xe1f5f50) at 0xe5b9438
  REFCNT = 1
  FLAGS = ()
  PV = 0
SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51
SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51

注意:当$filenameSpecio::Constraint::Simple->_optimized_constraint变量时,是不同的

$::{ "_<$filename" }      # SV = PV(0xe1f5f50) at 0xe5b9438
${ $::{ "_<$filename" } } # SV = PV(0x14f6a30) at 0x184b200

但是当$filename /home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm变量时,here(请参阅UPD部分)相同

$::{ "_<$filename" }             # SV = PV(0x2e43d80) at 0x2f40400
${ $::{ "_<$filename" } }        # SV = PV(0x2e43d80) at 0x2f40400

1 个答案:

答案 0 :(得分:3)

这是因为变量$filename包含双冒号,因此当用作符号引用的一部分时,这些双冒号将被解释为名称空间分隔符。直接浏览符号表(存储)不会将它们解释为分隔符,因为名称空间由物理存储层次结构区分。因此,要访问其符号名称可能包含双冒号的变量,需要直接存储访问。通常,我建议使用Package::Stash处理这种隐藏,但是由于无法正常使用它们作为变量,因此它不允许访问包含双冒号的符号名称。