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

时间:2008-11-12 00:45:08

标签: php perl dynamic variables

在PHP中,我可以写:

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

...脚本将输出“555-1234”。

Perl中是否有任何等效内容?

有没有办法将$phone限制在本地块的范围内,就像我写了my $phone一样?使用my $$vname给我“无法在我的...中声明标量取消引用”错误。

5 个答案:

答案 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' 中的这种做法的咆哮。

您可以通过

启动块来将更改范围限制为$ phone
local $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++;
}