11

PHPでは、次のように書くことができます。

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

...そしてスクリプトは「555-1234」を出力します。

Perlに同等のものはありますか?

$phone私が書いたかのように、ローカルブロックのスコープに制約する方法はありますmy $phoneか?を使用my $$vnameすると、「at...でスカラー間接参照を宣言できません」というエラーが発生します。

4

5 に答える 5

57

あなたがやろうとしていることは、「シンボリック参照」と呼ばれます。Perl ではこれを行うことができますが、すべきではありません。シンボリック参照は、グローバル変数でのみ機能します。レキシカル ( my) 変数では機能しません。それらの範囲を制限する方法はありません。シンボリック参照は危険です。そのため、strictプラグマの下では機能しません。

一般に、シンボリック参照が必要だと思うときはいつでも、代わりにハッシュを使用する必要があります。

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

symrefs が便利で必要な場合もいくつかあります。たとえば、Perl のエクスポート メカニズムはそれらを使用します。これらは高度なトピックです。それらの準備が整う頃には、方法を尋ねる必要はありません。;-)

于 2008-11-12T02:25:22.300 に答える
13

なぜ「変数を変数名として使用するのはばかげている」 でこれを行うことに対する Mark-Jason Dominus の暴言を読んでください。

ブロックを $phone で開始することにより、変更の範囲を $phone に制限します。

local $phone;

あるいは

local $$vname;

my()(ただし、ブロックから呼び出されたサブルーチンの $phone も変更するため、宣言のレキシカル スコープと同じではありません。)

于 2008-11-12T08:08:20.530 に答える
8

非常によく似た方法でそれを行うことができます:

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

しかし、できるからといって、そうすべきだというわけではありません。これを管理する最善の方法は、Michael Carman が言うように、ハッシュを使用することです!

于 2008-11-12T00:56:46.893 に答える
6

strict プラグマを有効にしてこれを行うことはできません。通常、strict プラグマは常に有効にする必要があります。ただし、プラグマをオフにして実行できます。次の 1 つのライナーを見てください。

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

それは機能しますが、これは機能しません:

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

「-Mstrict」は「厳密を使用する」ことを示します。

ほとんどの場合、このようなものにはハッシュを使用することをお勧めします。これは、PHP の連想配列とほぼ同じです。

于 2008-11-12T01:12:19.683 に答える
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++;
}
于 2009-07-21T01:24:30.113 に答える