Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl是否有类似PHP的动态变量?_Php_Perl_Dynamic_Variables - Fatal编程技术网

Perl是否有类似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;

在PHP中,我可以编写:

$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枪射自己的脚一样。