【问题标题】:Does Perl have PHP-like dynamic variables?Perl 有类似 PHP 的动态变量吗?
【发布时间】:2010-09-21 21:51:48
【问题描述】:

在 PHP 中,我可以这样写:

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

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

Perl 中有什么等价物吗?

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

【问题讨论】:

  • 我把这个放在CMS的回答中是因为我没有看到这个编辑,但应该是“$$vname = '555-1234'”,去掉“my”。
  • 即使在 PHP 中,这也是不推荐使用的代码。正如其他人发布的那样,使用哈希。
  • 该功能是从 Perl 复制的,当时 PHP 是用 Perl 编写的。
  • PHP 从来没有用 Perl 编写过 twitter.com/rasmus/status/226405807305138176
  • 请注意,四年后,我为自己曾经问过这个问题而深感羞愧。 :)

标签: php perl dynamic variables


【解决方案1】:

你可以用非常相似的方式来做:

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

但你可以并不意味着你应该。管理此问题的最佳方法是,as Michael Carman says使用哈希!

【讨论】:

  • 为什么我不知道你可以在 Perl 中做到这一点?
  • Ta。有什么方法可以将 $phone 限制在本地块的范围内,就好像我写了“我的 $phone”一样?使用“my $$vname”会给我“无法在我的 at ... 中声明标量取消引用”错误。
  • 如果我必须关闭“严格”,结构就会被破坏。
  • 对于不赞成这一点的人:它回答了这个问题。
  • 小丑:不明白你的意思;要求的特性存在于 perl 中,但被认为足够危险,需要一个严格的模式来专门禁止它。这并不意味着它坏了,只是很危险。
【解决方案2】:

您不能在启用 strict pragma 的情况下执行此操作,并且通常应该始终启用 strict pragma。你可以在关闭编译指示的情况下做到这一点,看看这个衬里:

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

这会起作用,但这不会:

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

“-Mstrict”告诉它“使用严格”。

对这样的事情使用散列几乎总是更好,这与 PHP 中的关联数组大致相同。

【讨论】:

    【解决方案3】:

    您尝试执行的操作称为“符号引用”。虽然您可以在 Perl you shouldn't 中执行此操作。符号引用仅适用于全局变量——不适用于词法 (my) 变量。没有办法限制它们的范围。 符号引用很危险。因此,它们在strict pragma 下不起作用。

    一般来说,每当您认为需要符号引用时,您都应该使用散列:

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

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

    【讨论】:

      【解决方案4】:

      阅读 Mark-Jason Dominus 在 Why it's stupid to `use a variable as a variable name' 中反对这样做的咆哮。

      您可以通过以

      开头的块来限制对 $phone 的更改范围
      local $phone;
      

      甚至

      local $$vname;
      

      (尽管对于从您的块中调用的任何 subs 也更改了 $phone,但它与 my() 声明的词法范围不同。)

      【讨论】:

      • 我从未考虑过使用 C 来限制 symref 的范围。这既有趣又反常。这就像说你愿意在脚上开枪,但只能用 BB 枪。
      【解决方案5】:

      您确实意识到 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++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 2016-07-23
        • 2011-04-14
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多