这只是我的猜测,我找不到任何官方文件来证明,但似乎有效。
此外,ilmari
说我应该通过符号表进行操作:
${$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" } );
两者将指向同一物体。
但是,如果您的变量名称有双冒号,则必须通过符号表访问其值
更新
有人可能会注意到,这个答案没有直接回答我的问题。你是对的。
我在这里发布了两种不同方法访问变量值的测试结果,因为我认为这些发现很重要。
"${ \"_<$filename\" }"
被解析了两次。如果你在其中使用单引号,它将不会插值$filename
(因为单引号不会插值)? - Håkon Hægland