30 - Hash! veya likili Diziler Tekil-Scalar deikeni gznzde...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Hash! veya likili Diziler Tekil-Scalar deikeni gznzde nasl canlandrrsnz? Bir kutu, iinde bir deer olarak olarak deil mi? Kutunun zerindeki etikette, bu deerin ad yazl olabilir. Dizi ise yanyana bir ok kutu olarak canlandrlabilir. Kutularn en banda bu dizinin ad, her bir kutunun zerinde ise kutunun sra numaras bulunur. (0dan balayarak!) mdi u tabloya bakn: Para No Parann Ad 1234 32 MB RAM ip 2345 Soutma vantilatrPWS Kurulurken Hata Verirse 3456 Pentium II 400 MHz 4567 Pentium III 750 MHz 6789 Matrox Millenium AGP Ekran Kart Bu bilgileri Perlde nasl deikenlere yazabilirsiniz? sterseniz 10 ayr tekil-Scalar deiken oluturur herbirinin iine bu on ayn veriyi girebilirsiniz: $ParcaNo01 = 1234 $ParcaAdi01 = 32 MB RAM ip $ParcaNo02 = 2345 $ParcaAdi01 = Soutma Vantilatr $ParcaNo03 = 3456 $ParcaAdi01 = Pentium II 400 MHz ...... Ya da bir dizi-array deiken yapp, btn verileri iine koyabiliriz: @Parcalar = (1234, 32 MB RAM ip, 2345, Soutma Vantilatr, 3456, Pentium II 400 MHz....); Fakat her durumda, rnein 1234 ile 32 MB RAM ip deerlerinin ilikisi kaybolur. Yani ihtiya halinde 1234 numaral parann ad neydi acaba? derseniz, bu iki deiken tr de size hazr, kolay bir cevap veremez. Birinci trde, yani on ayr tekil deiken oluturduunuzda, hi bir deikenin dieriyle ilikisi olamaz. kinci trde, deikenlerin sra numaralarndan yararlanarak bir ilikilendirme mmkndr. rnein $Parcalar[0] ile $Parcalar[1] , 2 ile 3, 4 ile 5... ilikilendirilebilir: bunun iin birinciler ikincilerin endeksi saylabilir. Fakat bu kolay bir i deil. Fakat dedik ki, Perl hi bir ey deilse, tam teekkll bir liste programdr diye! te bunun bir sonucu olarak Perlde likilli Dizi (Associative Array) veya deer yazmak ve armakta kullanlan Unix komutunun adyla Hash Listesi diye bir zel deiken tr vardr. Bu deiken tr, adnn nne yzde (%) iareti konarak belirtilir. likili Dizilerde iki unsur bulunur: anahtar ve deer (key ve value). Her deerin bir anahtar; her anahtarn bir deeri vardr. Anahtar/deer iftine Kayt denir. likili Dizi, kaytlardan oluur. Bir ilikili Dizide ayn adda iki anahtar olamaz; fakat farkl anahtarlar ayn deere sahip olabilir. Her anahtarn bir deeri; her deerin bir anahtar vardr! dedik. Bu yzden rnein telefon defterinizi likili Dizi olarak yazamazsnz; nk bir kiinin birden fazla telefonu olabilir. Bunun gibi kstlamalar yznden likili Dizilerin snrl kullanm alan vardr. Fakat Perl, greceimiz gibi baz fonksiyonlarn sonucu olarak karmza likili Dizi deiken kartabilir; ayrca bu tr deiken iin kullanlmaya hazr bir ok fonksiyon vardr; dolaysyla biz uzun-uzun kendi fonksiyonlarmz yazmak zorunda kalmayz. imdi para listemizi likili Dizi olarak yazalm: %Parcalar = (1234, 32 MB RAM ip, 2345. Soutma Vantilatr, 3456, Pentium II 400 MHz....); Yukardaki kod geri amacmza ulamamz salar; ama okumas, yazmas kolay bir biimde deil. Perl 5 ile birlikte virgl (,) yerine, => operatrn kullanabilirsiniz. rnein, ayn deiken u deyimle de oluturtulabilir: %Parcalar = (1234 => 32 MB RAM ip 2345 => Soutma Vantilatr 3456 => Pentium II 400 MHz .... 6789 => Matrox Millenium AGP Ekran Kart ); Peki, anahtar buradaki gibi tek kelime, hatta say deil de birden fazla kelime ierek bir String ise ne yapabiliriz? Anahtar trmak iine alrz. te farkl bir para listesi likili Dizi biiminde: %Parcalar = (RAM ipleri => 32 MB Soutma vantilatrleri => Bronica CPU ipi => Pentium II 400 MHz .... AGP Ekran Kart => Matrox Millenium ); i bo, yani yeleri (anahtarlar ve anahtarlarn deerleri) atanmam likili Dizi oluturulabilir: %YeniParcalar = (); Perl, daha sonra iini dolduracanz bir dizi hazrlar ve bekler. imdi bir likili Dizi deikeninin anahtarn kullanarak, deerini bulalm ve bunu tekil/scalar deikene atayalm: $alnacak_parca = $Paralar{6789}; veya $alnacak_parca = $Paralar{AGP ekran Kart}; Burada birinci kodda $alinacak_parca deikeninin ierii Matarox Millenium AGP Ekran Kart olurken, ikinci kodda Matrox Millenium olur. imdi de likili Dizimizin bir anahtarnn deerini deitirelim. Bunun iin bir anahtara deer vermemiz gerekir: $Parcalar{RAM ipleri} = 64 MB; (burada kullandmz parantezin ssl parantez olduuna dikkat edin!) Yukarda iine 32 MB yazdmz RAM ipleri anahtarnn deerini 64 MB olarak deitirmi olduk. Byle bir deyimle karlan Perl, nce Parcalar adl likizi Dizi iinde RAM ipleri anahtar bulunup bulunmadna bakar; varsa deerini yeni verdiimiz String ile deitirir. ilikili Dizide verdiimiz adda bir anahtar yoksa, bu anahtar oluturulur ve deer olarak verdiimiz String atanr. Bu yntemle ii bo likili Dizide anahtar oluturabiliriz. Yukarda oluturduumuz ii bo YeniParcalar likili Dizisine yer anahtar aalm ve iine bir deer yazalm: $YeniParcalar{RAM ipleri} = 128 MB; Mevcut bir likili Dizinin anahtar/deer iftini (yani kaydn) tmyle silebiliriz; bunun iin delete fonksiyonunu kullanrz. delete fonksiyonuna argman olarak silinecek kaydn sadece anahtarn verirsiniz. yle: delete($Parcalar{RAM ipleri}); delete bir fonksiyondur; dolaysyla bir return deeri vardr; Perle bir deer verir. Bu deer, sildiiniz anahtarn deeridir. sterseniz, bu deeri bir tekil/Scalar deikene atayabilirsiniz. (Nasl?) likili Dizilerin kendi kolaylklar vardr, demitik. delete bunlardan biridir; dieri ise keys fonksiyonudur. keys fonksiyonu bir ilikili Dizinin btn anahtarlarnn listesini verir. rnein: @Parcalar_anahtarlar = keys(%Parcalar); deyimi ile Parcalar_anahtarlar adl bir dizi deiken (array) oluturuyoruz ve Parcalar adl likili Dizinin btn anahtarlarn deer olarak atyoruz. Dikkat edin! Anahtarlarn adlarn deer olarak atlyoruz; anahtarlarn deerlerini deil. Peki bu ne ie yarar? Bir rnek u olabilir: Web sitemizdeki Formdan gelen bilgileri tutan likili Dizide yer alan anahtarlar ve onlarn deerlerini kullanlr hale getirmek isteyebiliriz. Bunun rneini ilerde greceiz. Fakat bir noktaya iaret edelim. likili Dizinin iindeki anahtarlar alfabetik veya azalan-oalan bir srada tutulmaz; tesadf (random) bir sra ile tutulur. Dolaysyla bu anahtarlarn adlarn yazdrdmz yeni dizi deikenin ierii de sral olmayacaktr. Bu ilemi sort fonksiyonun geirerek yaparsak, yeni dizi deikenimizin ierii sralanm olur: @Parcalar_anahtarlar = sort(keys(%Parcalar)); likili Diziyi kullanl hale getiren hazr fonksiyonlardan bir dieri ise anahtarlarn deerlerini edinmemizi salayan values fonksiyonudur. Bu fonksiyon, bir likili Dizinin tm deerlerini verir. @Parcalar_degerler = values(%Parcalar); deyimi ile Parcalar_degerler adl bir dizi deiken (array) oluturuyoruz ; bu kez Parcalar adl likili Dizinin btn deerlerini deer olarak atyoruz. Burada dikkat edilecek nokta, yeni dizi deikenimizin baz deerlerinin ayn olabileceidir. likili Dizide her anahtar zgn olmaldr; anahtar adlar ayn olamaz, fakat farkl anahtarlar ayn deere sahip olabilir, demitik. Dolaysyla values fonksiyonu ile oluturduumuz yeni dizi deikende baz deerler ayn olabilir. Anahtarlar gibi, likili Dizinin iindeki deerler de alfabetik veya azalan-oalan bir srada tutuld tesadf (random) bir sra ile tutulduu iin yeni dizi deikenin ierii de sral olmaz. Bu ilemi de sort fonksiyonundan geirebiliriz; yeni dizi deikenimizin ierii sralanm olur: @Parcalar_degerler = sort(values(%Parcalar)); Buraya kadar yine bir ok eyi bir arada rendik; durum biraz nefes almak ve bir rnek yapmak iyi olur. imdi an Not Defterini (veya en beendiiniz dz yaz programn ve sizinle birlikte basit bir form oluturalm. inde form olan HTML kodumuz yle olabilir: <HTML> <HEAD> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> <meta http-equiv="Content-Language" content="tr"> <TITLE>Sizinle nasil temas kuralim</TITLE> </HEAD> <BODY> <H1>Sizinle nasl temas kuralm?</H1> <FORM NAME="temasform" ACTION="form_analiz.pl" METHOD="Post"> <P>Adnz: <INPUT TYPE="text" NAME="Adi" SIZE="37" maxlength="25"></P> <P>Adresiniz: <INPUT TYPE="text" NAME="Adres" SIZE="37"></P> <P>Posta Kodu: <INPUT TYPE="text" NAME="Kod" size="37" maxlength="5"></P> <P>E-Posta: <INPUT TYPE="text" NAME="eposta" size="37"></P> <P>Eitim: <INPUT TYPE="checkbox" NAME="ilkokul" value="ON">Ilk <INPUT TYPE="checkbox" NAME="Orta" value="ON">Orta <INPUT TYPE="checkbox" NAME="yuksek" value="ON">Yksek <P>Merak Alan: <SELECT NAME="Merak" SIZE="1"> <OPTION SELECTED VALUE="Bir alan seiniz">Bir alan seiniz</OPTION> <OPTION VALUE="Polisiye">Polisiye</OPTION> <OPTION VALUE="Siir">iir</OPTION> <OPTION VALUE="Tarih">Tarih</OPTION> <OPTION VALUE="Siyaset">Siyaset</OPTION></SELECT> <P>Bize iletmek istediiniz bir mesaj var m?</P> <TEXTAREA ROWS="5" NAME="mesaj" cols="33">Mesajnz buraya yaznz: </TEXTAREA> <p><INPUT TYPE="submit" VALUE="Gnder" name="Gonder"> <INPUT TYPE="reset" VALUE="Sil" name="Sil"></P> </FORM> </BODY> </HTML> Bu Formda kullandmz etiketleri tanyor ve bir Web tasarmcs olarak bu tr Formlar sk sk tasarlyor olmalsnz. Bu kodu yazdktan sonra form.htm adyla kaydedin. Bu ilkelere dayanan bir form yle olabilir: imdi Formun ACTION zelliinde ad geen Perl programn yazalm. Aadaki kodu da Not Defteri gibi bir dz yaz programnda yazarak ve ACTIONda verdiiniz isimle kaydedin: #!/usr/local/bin/perl #form_analiz.pl if ($ENV{'REQUEST_METHOD'} eq 'GET') { @girdiler = split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read (STDIN, $depo, $ENV{'CONTENT_LENGTH'}); @girdi = split(/&/, $depo); } else { print "Content-type: text/html\n\n"; print "<P>Formda bir hata var!"; } foreach $girdi (@girdiler) { ($anahtar, $deger) = split (/=/, $girdi); $anahtar =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~ tr/+/ /; $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $deger =~s/<!--(.|\n)*-->//g; if ($formveri{$anahtar}) { $formveri{$anahtar} .= ", $deger"; } else { $formveri{$anahtar} = $deger; } } print "Content-type: text/html\n\n"; print "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n"; foreach $anahtar (sort keys(%formveri)) { print "<P><B>$anahtar</B> alanna <B>$formveri{$anahtar} </B>deeri girildi."; } imdi bu kodu irdeleyelim ve rendiklerimizi bu kodda belirleyelim, bilmediklerimizi renelim. ...
View Full Document

Ask a homework question - tutors are online