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