PHPでは、次のように書くことができます。
$vname = 'phone';
$$vname = '555-1234';
print $phone;
...そしてスクリプトは「555-1234」を出力します。
Perlに同等のものはありますか?
$phone
私が書いたかのように、ローカルブロックのスコープに制約する方法はありますmy $phone
か?を使用my $$vname
すると、「at...でスカラー間接参照を宣言できません」というエラーが発生します。
あなたがやろうとしていることは、「シンボリック参照」と呼ばれます。Perl ではこれを行うことができますが、すべきではありません。シンボリック参照は、グローバル変数でのみ機能します。レキシカル ( my
) 変数では機能しません。それらの範囲を制限する方法はありません。シンボリック参照は危険です。そのため、strict
プラグマの下では機能しません。
一般に、シンボリック参照が必要だと思うときはいつでも、代わりにハッシュを使用する必要があります。
my %hash;
$hash{phone} = '555-1234';
print $hash{phone};
symrefs が便利で必要な場合もいくつかあります。たとえば、Perl のエクスポート メカニズムはそれらを使用します。これらは高度なトピックです。それらの準備が整う頃には、方法を尋ねる必要はありません。;-)
なぜ「変数を変数名として使用するのはばかげている」 でこれを行うことに対する Mark-Jason Dominus の暴言を読んでください。
ブロックを $phone で開始することにより、変更の範囲を $phone に制限します。
local $phone;
あるいは
local $$vname;
my()
(ただし、ブロックから呼び出されたサブルーチンの $phone も変更するため、宣言のレキシカル スコープと同じではありません。)
非常によく似た方法でそれを行うことができます:
$vname = "phone";
$$vname = "555-1234";
print $phone;
しかし、できるからといって、そうすべきだというわけではありません。これを管理する最善の方法は、Michael Carman が言うように、ハッシュを使用することです!
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 の連想配列とほぼ同じです。
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++;
}