SORU
30 Kasım 2009, PAZARTESİ


'karma arasındaki fark ne ve Perl karma başvurusu?

Düzgün Perl sağlamalarının anlamak istiyorum. Oldukça uzun bir süre için Perl zaman zaman kullanmak zorunda kaldım ve genelde bunu yapmam gerektiğinde, çoğunlukla metin işleme ile ilgili.

Ve her şey karma ile uğraşmak zorunda, berbat olur. Sözdizimi sağlamalarının çok gizemli buluyorum

Karma ve karma başvurular, iyi bir açıklama gerekli olduklarında, farklılıklarını, vb. çok mutluluk duyacağız.

CEVAP
30 Kasım 2009, PAZARTESİ


Basit bir hash bir dizi bulunur. Onların başlatmaları bile benzer. İlk dizi:

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Şimdi gelelim bir karma (aka ilişkisel dizi) ile aynı bilgileri gösterir:

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Aynı ada sahip olsa da, dizi @last_name karma %last_name tamamen bağımsız.

Eğer Archie soyadını öğrenmek istiyorsak dizisinde, doğrusal bir arama gerçekleştirmek için:

my $lname;
for (my $i = 0; $i < @last_name; $i  = 2) {
  $lname = $last_name[$i 1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";

Karma ile, çok daha doğrudan sözdizimi:

print "Archie $last_name{Archie}\n";

Sadece biraz daha zengin yapısı ile bilgi temsil etmek istiyoruz dediler

  • Cleaver (soyadı)
    • Ward (ilk adı)
    • Haziran (eşinizin adı)
  • Çakmaktaş
    • Fred
    • Wilma
  • Bunker
    • Archie
    • Edith

Başvurular gelmeden önce, düz anahtar-değer sağlamalarının yapabileceğimiz en iyi olduğunu, ancak başvurular sağlar

my %personal_info = (
    "Cleaver", {
        "FIRST",  "Ward",
        "SPOUSE", "June",
    },
    "Flintstone", {
        "FIRST",  "Fred",
        "SPOUSE", "Wilma",
    },
    "Bunker", {
        "FIRST",  "Archie",
        "SPOUSE", "Edith",
    },
);

DAHİLİ olarak, %personal_info anahtarları ve değerleri skaler ama bütün değerleri skaler özel bir tür: karma referanslar {} ile oluşturulmuş. Başvurular bize benzet "çok boyutlu" karma olanak sağlar. Örneğin, üzerinden Wilma için alabiliriz

$personal_info{Flintstone}->{SPOUSE}

Perl bizi alt simgeler, yukarıdaki arasında oklar atlamak için izin verdiğini unutmayın eşdeğerdir

$personal_info{Flintstone}{SPOUSE}

Eğer Fred hakkında daha fazla şey öğrenmek istiyorsanız yazarak çok, bir imleç gibi bir referans kapmak olabilir:

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

Parçacık yukarıda $fred bir hashref çünkü, ok gereklidir. Bu işe karıştırma ama akıllıca use strict hataları bu tür yakalamak için etkinleştirilmişse, derleyici şikayet eder:

Global symbol "%fred" requires explicit package name at ...

Perl referansları C ve C işaretçileri benzer , ama asla boş olabilir. C ve C işaretçileri kaldırma ve Perl başvuruları yapmak gerekir.

Sadece onlar kopya, değişiklik arayan kişiye geri alamadım. C işlev parametreleri-by pass-değer mantığı C ve: Eğer değişiklikleri görmek istiyorsanız, bir işaretçi geçirmek için var. Perl referansları ile bu etkiyi elde edebilirsiniz

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",
        SPOUSE => "Betty",
    };
}

add_barney \%personal_info;

, add_barney eğik çizgi olmadan gelemezdi uzakta yakında alt döner olarak atılmış olan bir kopya.

Ayrıca "virgül" (=>) yukarıda. yağ kullanımına dikkat edin Onun sol dize autoquotes ve daha az gürültülü sözdizimsel karma başlatmaları yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • nigahiga

    nigahiga

    21 Temmuz 2006
  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • The Dubstep FX

    The Dubstep

    5 Mart 2011