Perl是否具有类似PHP的动态变量?

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()声明的词法范围不同.)

  • 我从未考虑使用C <local>来限制symref的范围.这既有趣又有悖常理.这就像是说你愿意用脚射击自己,但只能使用BB枪. (3认同)

CMS*_*CMS 8

你可以用非常类似的方式做到这一点:

$vname = "phone";
$$vname = "555-1234";
print $phone;
Run Code Online (Sandbox Code Playgroud)

但你可以并不意味着你应该这样做.正如Michael Carman所说,管理这个问题的最佳方法是使用HASH!

  • 如果我必须关闭"严格",那么构造就会被打破. (8认同)

gpo*_*ojd 6

启用严格编译指示时无法执行此操作,通常应始终启用严格编译指示.你可以用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中的关联数组大致相同.