在PHP中,我可以写:
$vname = 'phone';
$$vname = '555-1234';
print $phone;
...脚本将输出“555-1234”。
Perl中是否有任何等效内容?
有没有办法将$phone
限制在本地块的范围内,就像我写了my $phone
一样?使用my $$vname
给我“无法在我的...中声明标量取消引用”错误。
答案 0 :(得分:56)
您尝试做的事情被称为“符号参考”。虽然您可以在Perl you shouldn't中执行此操作。符号引用仅适用于全局变量 - 而不是词法(my
)。没有办法限制他们的范围。 符号引用很危险。因此,它们不能在strict
编译指示下工作。
通常,只要您认为需要符号引用,就应该使用哈希:
my %hash;
$hash{phone} = '555-1234';
print $hash{phone};
在某些情况下,symrefs很有用,甚至是必要的。例如,Perl的导出机制使用它们。这些都是高级主题。当你准备好它们时,你不需要问如何。 ; - )
答案 1 :(得分:13)
阅读Mark-Jason Dominus对 Why it's stupid to `use a variable as a variable name' 中的这种做法的咆哮。
您可以通过
启动块来将更改范围限制为$ phonelocal $phone;
甚至
local $$vname;
(虽然要么从你的块中调用任何sub来改变$ phone,所以它与my()
声明的词法范围不同。)
答案 2 :(得分:8)
你可以用非常类似的方式做到这一点:
$vname = "phone";
$$vname = "555-1234";
print $phone;
但是你并不意味着你应该这样做。管理此问题的最佳方法是as Michael Carman says,使用哈希!
答案 3 :(得分:6)
启用严格编译指示时无法执行此操作,通常应始终启用严格编译指示。你可以用pragma关闭它,看看这个衬垫:
perl -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
这会奏效,但不会:
perl -Mstrict -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
“ - Mstrict”告诉它“使用严格”。
对这样的事情使用哈希几乎总是更好,这与PHP中的关联数组大致相同。
答案 4 :(得分:0)
你确实知道PHP从Perl继承了它的许多功能,对吗?
Perl不仅可以完成PHP的所有符号引用,
use strict;
use warnings;
use 5.010;
our $test=1;
# Access $test through the special hash %::
say ${$::{test}}++;
# This is essentially what the previous line did.
say ${\$test}++
# Same as $test
say ${test}++;
{
# PHP's simple symbolic ref
my $ref = "test";
no strict 'refs';
say $$ref++;
say ${"test"}++;
}
{
package d;
say ${$main::{test}}++;
my $ref = $main::{"test"};
say $$ref++;
$ref = \$main::test;
say $$ref++;
}