这只是我的假设,我找不到任何关于此的官方文档,但它似乎有效。
还有ilmari说我应该go via the symbol table:
${$main::{'_<foo::bar::baz'}}
因此我的代码分为两种情况:。
案例 1:
Devel::Peek::Dump( ${ "::_<$filename" } );
Devel::Peek::Dump( ${ '::_<' ."$filename" } );
Devel::Peek::Dump( ${ "::_<Specio::Constraint::Simple->_optimized_constraint" } );
Devel::Peek::Dump( ${ '::_<Specio::Constraint::Simple->_optimized_constraint' } );
所有这些都是一样的。双引号还是单引号:没关系。
SV = PV(0xe64ab00) at 0xe300bc8
REFCNT = 1
FLAGS = ()
PV = 0
案例 2:
Devel::Peek::Dump( ${ ${ 'main::' }{ "_<$filename" } } );
Devel::Peek::Dump( ${ ${'::'}{ "_<$filename" } } );
Devel::Peek::Dump( ${ $::{ "_<$filename" } } );
Devel::Peek::Dump( ${ $::{"_<Specio::Constraint::Simple->_optimized_constraint"} } );
Devel::Peek::Dump( ${ $::{'_<Specio::Constraint::Simple->_optimized_constraint'} } );
也不管它是如何被引用的。只需通过符号表,我就可以达到该值:
SV = PV(0x15e0a40) at 0x186cd10
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1934880 "Specio::Constraint::Simple->_optimized_constraint"\0
CUR = 49
LEN = 51
调查结果
不管如何引用变量名。唯一不同的是我们的方式:
- 直接
- 通过符号表
因此,如果你的变量名没有双冒号,那么你可以使用任何一种形式:
Devel::Peek::Dump( ${ $::{ "$name" } } );
Devel::Peek::Dump( ${ "::$name" } );
两者都会引用同一个东西。
但是如果你的变量名有双冒号,那么你必须只能通过符号表访问它的值
UPD
有人可能会注意到这个答案并没有直接回答我的问题。你说的对。
我在这里发布了两种访问变量值的不同方法的测试结果,因为我认为这些发现很重要。