Perl是否有类似PHP的动态变量?
在PHP中,我可以编写:Perl是否有类似PHP的动态变量?,php,perl,dynamic,variables,Php,Perl,Dynamic,Variables,在PHP中,我可以编写: $vname = 'phone'; $$vname = '555-1234'; print $phone; 。。。脚本将输出“555-1234” Perl中有任何等价物吗 是否有任何方法将$phone约束到本地块的范围内,就像我编写了我的$phone?使用my$$vname会出现“无法在my at…”中声明标量解引用”错误。您可以用非常类似的方式执行此操作: $vname = "phone"; $$vname = "555-1234"; print $phone;
$vname = 'phone';
$$vname = '555-1234';
print $phone;
。。。脚本将输出“555-1234”
Perl中有任何等价物吗
是否有任何方法将
$phone
约束到本地块的范围内,就像我编写了我的$phone
?使用my$$vname
会出现“无法在my at…”中声明标量解引用”错误。您可以用非常类似的方式执行此操作:
$vname = "phone";
$$vname = "555-1234";
print $phone;
但你能,并不意味着你应该。最好的管理方法是,使用散列启用严格杂注时无法执行此操作,并且通常应始终启用严格杂注。不过,您可以在不使用pragma的情况下执行此操作,请看以下一行:
perl -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
这会起作用,但不会:
perl -Mstrict -le 'my $vname = "phone"; ${ $vname } = "555-1234"; print $phone'
“-Mstrict”告诉它“使用strict”
对于类似的内容,使用哈希几乎总是更好的,这与PHP中的关联数组大致相同 您试图做的被称为“符号引用”,而您可以在Perl中这样做。符号引用仅适用于全局变量,而不适用于词法(
my
)变量。没有办法限制它们的范围符号引用是危险的。因此,它们在严格的杂注下不起作用
通常,当您认为需要符号引用时,应使用哈希:
my %hash;
$hash{phone} = '555-1234';
print $hash{phone};
在一些情况下,symref是有用的,甚至是必要的。例如,Perl的导出机制使用它们。这些都是高级主题。等你准备好了,你就不需要问怎么做了 读马克·杰森·多米努斯(Mark Jason Dominus)反对在美国这样做的咆哮
您可以将更改的范围限制为$phone,方法是从
local $phone;
甚至
local $$vname;
(虽然也可以为从块中调用的任何sub更改$phone,因此它与my()
声明的词法范围不同。)您确实意识到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++;
}
为什么我从来都不知道你可以用Perl来做呢。有没有办法将$phone限制在本地块的范围内,就像我写了“我的$phone”一样?使用“my$$vname”会给我“无法在我的at中声明标量解引用…”错误。如果我必须关闭“strict”,则构造将被破坏。对于否决此项的人:它回答了问题。Harleqin:不确定你的意思;所要求的特性存在于perl中,但被认为是非常危险的,需要一个严格的模式专门禁止它。这并不意味着它坏了,只是很危险。我把它放在CMS的答案中,因为我没有看到这个编辑,但它应该是“$$vname='555-1234'”,删除“my”。即使在PHP中,这也是不推荐使用的代码。正如其他人所发布的,使用散列。该功能是从Perl复制的,当时PHP是用Perl编写的。PHP从未用Perl编写。请注意,四年后,我对自己曾经问过这个问题深感惭愧。:)我从未想过使用C来限制symref的范围。这既有趣又反常。这就像说你愿意用BB枪射自己的脚一样。