在PHP中,我可以写:
$vname = 'phone'; $$vname = '555-1234'; print $phone;
...脚本将输出"555-1234".
Perl中有任何等价物吗?
有没有办法限制$phone
本地区块的范围,就像我写的那样my $phone
?使用my $$vname
给了我"不能在我的...中声明标量解除引用"错误.
你试图做的事情被称为"象征性参考".虽然你可以在Perl中做到这一点,但你不应该这样做.符号引用仅适用于全局变量 - 而不是词法(my
).没有办法限制他们的范围.符号引用很危险.出于这个原因,他们不会在strict
实用主义下工作.
通常,只要您认为需要符号引用,就应该使用哈希:
my %hash; $hash{phone} = '555-1234'; print $hash{phone};
在某些情况下,symrefs是有用的,甚至是必要的.例如,Perl的导出机制使用它们.这些都是高级主题.当你准备好它们时,你不需要问如何.;-)
阅读Mark-Jason Dominus对于这样做的咆哮,为什么"使用变量作为变量名称"是愚蠢的.
您可以通过启动块来限制更改范围到$ phone
local $phone;
甚至
local $$vname;
(虽然要么从你的块中调用任何sub来改变$ phone,所以它与my()
声明的词法范围不同.)
你可以用非常类似的方式做到这一点:
$vname = "phone"; $$vname = "555-1234"; print $phone;
但你可以并不意味着你应该这样做.正如Michael Carman所说,管理这个问题的最佳方法是使用HASH!
启用严格编译指示时无法执行此操作,通常应始终启用严格编译指示.你可以用pragma关闭它,看看这个衬垫:
perl -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
这将有效,但这不会:
perl -Mstrict -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
"-Mstrict"告诉它"使用严格".
对这样的东西使用哈希几乎总是更好,这与PHP中的关联数组大致相同.