Perl PHP gibi dinamik değişkenler var mı?

5 Cevap php

PHP, ben yazabilirim:

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

... Ve komut çıktısı "555-1234".

Perl herhangi bir eşdeğer var mı?

Edit: Teşekkürler, CMS.

"Benim $ telefon" yazmış sanki, yerel blok kapsamında $ telefon sınırlamak için herhangi bir yolu var mı? "My $ $ VName" kullanarak bana "benim de skaler çözümlemesi beyan edemez ..." hataları veriyor.

5 Cevap

Sen çok benzer bir şekilde yapabilirsiniz:

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

Edit: Ama sen, bu yönetmek için en iyi yoldur gerektiği anlamına gelmez ki Michael dediği gibi, USE HASH!

Ne yapmak için çalışıyorsanız "sembolik bir referans" denir. Perl yapabilirsiniz yaparken you shouldn't. Sözcük değil (my) olanlar - Sembolik referanslar sadece global değişkenler ile çalışır. Onların kapsamını kısıtlamak için hiçbir yolu yoktur. Symbolic references are dangerous. İşte bu nedenle strict pragma altında çalışmaz.

Eğer sembolik başvurular gerek olduğunda genel olarak, bunun yerine bir karma kullanmanız gerekir:

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

Symrefs yararlı ve hatta gerekli bir kaç durumlar vardır. Örneğin, Perl ihracat mekanizması kullanır. Bu gelişmiş konular vardır. Onlar için hazırsınız zaman nasıl sormak gerekmez. ;-)

Bunu yaparken karşı Mark-Jason DOMINUS en rants okuyun: http://www.plover.com/perl/varvarname.html

Sen ile blok başlayarak $ telefonunuza değişikliklerin kapsamını sınırlamak olur

local $phone;

ya da

local $$vname;

(Gerçi o çok bloktan herhangi denizaltılar için $ telefon değiştirir, bu yüzden benim () beyanının sözcüksel kapsam olarak aynı değil.)

Etkinleştirilmiş sıkı pragma ile bunu yapamaz, ve sıkı Pragma genellikle her zaman etkin olmalıdır. Eğer olsa, bu bir liner bakmak pragma kapalı ile yapabilirsiniz:

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

Bu çalışacaktır, ama bu olmaz:

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

"-Mstrict" "sıkı kullanmak" anlatır.

PHP bir ilişkisel dizi olarak yaklaşık aynı böyle bir şey, bir karma kullanmak için hemen hemen her zaman daha iyidir.

PHP Perl bu özelliklerinden çok devralır fark, sağ mı?

Perl sembolik referans şeyler PHP can tüm yapmak değil sadece.

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++;
}