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