Basit bir karma bir diziye yakın. Başlatmaları bile benzer gözüküyor.İlk dizi:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Şimdi
en karmasının (aka ilişkisel dizi) ile aynı bilgiyi temsil edelim: aynı ada sahip olsa da
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
, dizi @last_name
ve karma %last_name
tamamen bağımsızdır . Biz Archie soyadını bilmek istiyorsak, doğrusal bir arama gerçekleştirmek zorunda dizi ile
: karma ile
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";
, çok daha direkt sözdizimsel var:
print "Archie $last_name{Archie}\n";
Say Sadece biraz daha zengin yapısı ile bilgiyi göstermek istiyoruz:
- Cleaver (soyad)
- Ward (ad)
- Haziran (eşinin ilk ad)
- Bunker
- Çakmaktaş referanslar gelmeden önceArchie
- Edith
, düz anahtar-değer karmaları biz gelen en iyisi, ama referanslar, Dahili olarak anahtarları ve değerleri
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
izin
%personal_info
, skalerlerin tümüdür, ancak değerler, özel bir tür skaler: hash başvurusu olup,
{}
ile oluşturulmuştur. Referanslar "çok boyutlu" karmaları simüle etmemize izin veriyor. Örneğin, Perl bize simgeler arasındaki okları çıkarmanıza olanak sağlar
$personal_info{Flintstone}->{SPOUSE}
Not yoluyla Wilma alabilirsiniz, bu nedenle yukarıdaki bilmeni istiyorum eğer yazarak bir sürü
$personal_info{Flintstone}{SPOUSE}
eşdeğerdir daha Fred, böylece bir imleç tür olarak bir başvuru kapmak olabilir:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
yukarıdaki kod parçasında $fred
bir hashref olduğundan, ok gereklidir.
Global symbol "%fred" requires explicit package name at ...
Perl referansları C ve C++ işaretçiler benzer, ancak bunlar boş olamaz: Eğer dışarı bırakır ama akıllıca hataların bu tür yakalamak için use strict
etkinse, derleyici şikayet edecektir. C ve C++ öğelerindeki işaretçiler, dizgeyi gerektirir ve bu nedenle Perl'de başvurular yapılır.
C ve C++ işlev parametrelerinin değer-arası anlamsallıkları vardır: bunlar yalnızca kopyalardır, bu nedenle değişiklikler arayana geri dönmez. Değişiklikleri görmek isterseniz, bir işaretçiyi geçmelisiniz. Sen Perl referanslarla bu etkiyi elde edebilirsiniz:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
ters eğik çizgi olmadan, add_barney
alt döndüğü anda atılır oluyor bir kopyasını kazanılmış olacaktı.
Ayrıca, yukarıdaki "yağ virgül" (=>
) 'un kullanımını da unutmayın. Soldaki dizeyi otomatik olarak seçer ve karma başlatmaları daha az sözdizimsel olarak gürültülü hale getirir.
_ * size bir elmayı uzatır * _ bir karma olduğunu farz et. _ * eller el buzdolabında bir elmaya yol tarifi yazdı * _ bu bir karma referanstır. –
_hearning Perl_'un karma bölümleri konusundaki bölümüne bakabilirsiniz. –
@ ~ quack: Keşke bir yorum yapmaktan ziyade bir cevap olmuş olsaydım, böylece seni doğru şekilde söyleyebilirim. –