当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Perl是否具有类似PHP的动态变量?》经验,为你挑选了4个好方法。

在PHP中,我可以写:

$vname = 'phone';
$$vname = '555-1234';
print $phone;

...脚本将输出"555-1234".

Perl中有任何等价物吗?

有没有办法限制$phone本地区块的范围,就像我写的那样my $phone?使用my $$vname给了我"不能在我的...中声明标量解除引用"错误.



1> Michael Carm..:

你试图做的事情被称为"象征性参考".虽然你可以在Perl中做到这一点,但你不应该这样做.符号引用仅适用于全局变量 - 而不是词法(my).没有办法限制他们的范围.符号引用很危险.出于这个原因,他们不会在strict实用主义下工作.

通常,只要您认为需要符号引用,就应该使用哈希:

my %hash;
$hash{phone} = '555-1234';
print $hash{phone};

在某些情况下,symrefs是有用的,甚至是必要的.例如,Perl的导出机制使用它们.这些都是高级主题.当你准备好它们时,你不需要问如何.;-)



2> ysth..:

阅读Mark-Jason Dominus对于这样做的咆哮,为什么"使用变量作为变量名称"是愚蠢的.

您可以通过启动块来限制更改范围到$ phone

local $phone;

甚至

local $$vname;

(虽然要么从你的块中调用任何sub来改变$ phone,所以它与my()声明的词法范围不同.)


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

3> CMS..:

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

$vname = "phone";
$$vname = "555-1234";
print $phone;

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


如果我必须关闭"严格",那么构造就会被打破.

4> gpojd..:

启用严格编译指示时无法执行此操作,通常应始终启用严格编译指示.你可以用pragma关闭它,看看这个衬垫:

perl -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'

这将有效,但这不会:

perl -Mstrict -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'

"-Mstrict"告诉它"使用严格".

对这样的东西使用哈希几乎总是更好,这与PHP中的关联数组大致相同.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有