Aytaç Kalıncı – Perl Referanslar

REFERANSLAR

 

Referans herhangi bir diziye, değişkene, altprograma işaret koymaktır denilebilir. Bir referans, bir değer için adrestir. Referanslar karışık data yapıları oluşturmada çok faydalıdırlar. Karışık data yapılarını gerçekte referanssız tanımlayamazsınız.

Perl5 hard ve sembolik referanslar sunar. Bir sembolik referans; değişken adını içerir. Sembolik referanslar değişken adı yaratmak ve onları çalışma anında adreslemek için çok yararlıdırlar. Temel olarak sembolik bir referans bir file adına benzer veya UNIX’ deki soft link gibidir. Hard referans ise hard linkler gibidirler. Sadece aynı yere bir başka yoldur. Hard referanslar referans sayısını izler bu sayı 0 olunca başvurulan yeri serbest bırakır.

 

Referansları Kullanma :

 

Bir skalar değer bir değişkene başvursun. $gosterge.  Herhangi bir skalar bir hard referans tutabilir. Çünkü diziler hash’lar(bileşik diziler) skalar içerirler . Bunları dikkate alarak kompleks yapılar inşa edilebilir.

$gosterge’nin değerini, bir diziye gösterge olarak kullanmak için dizi içindeki maddeye başvurulur. Şu notasyonla : @$gosterge. Bu kullanım kabaca, $gosterge nin adresini alır ve onu bir dizi olarak kullanır şeklinde anlaşılabilir. Benzer şekilde hash’lar (Bileşik Dizi) için %$gostergegösterimini kullanırız. Bu durum hash’ın ilk elemanına işaret koyarız anlamındadır.

 

 

Backslash (\) Operatörü Kullanımı :

 

Bir operatörün adresini geçirmek için kullanılır. Genelde değişkene ikinci bir yeni

referans yaratma amacıyla kullanılır.

 

$degisken = 10; $gosterge = \$degisken;

Burada; $gosterge, $degisken in değerini (10) içeren yere işaret koyar(referans verir). $degisken içindeki değeri $gostergeden alabilirsinizhatta $degisken yok olsa dahi. Burada çalışan hard referanstır. $gosterge değişkeni , $degisken’in adresini içerir onun değerini değil.Değere erişmek için iki adet $ ile refere($$gosterge ) edilir.

 

Örnek :

#!/usr/bin/perl

$deger = “ertan”;

$gosterge = \$deger;

printf “‘\$deger’ degiskeninin içindeki değer $deger olup, gösterge adresi:  $gosterge\n”;

printf “$gosterge memory adresindeki değer: $$gosterge\n”;

 

 

 

Çalışması ; program.pl

 

‘$deger’ degiskeninin içindeki değer ertan olup, gösterge adresi:  SCALAR(0x80c1288)

SCALAR(0x80c1288) memory adresindeki değer: ertan

 

 

 

Referans ve Diziler :

 

Perl konusunda belki en önemli nokta tüm @dizi ve %hash lar tek boyutludur ve skalar değer tutarlar ve direkt olarak dizi ve karmaşık data yapıları içermezler. Bir dizi elemanı sayı veya referans  dır. Backslash operatörü ( \ )  ile  skalar değişken gibi kullanılırlar.

 

Örnek :

#!/usr/bin/perl  $gosterge = \@ARGV;  printf “\n ARGV nin gösterge(pointer) Adresi = $gosterge \n”;  $i = scalar(@$gosterge);  printf “\n Argüman sayısı : $i \n”;  $i = 0;  foreach (@$gosterge) {      printf “$i : $$gosterge[$i++];\n”;      }

Çalışması ;  program.pl   1  2  3  4

ARGV nin gösterge(pointer) Adresi = ARRAY(0x806c378) Argüman sayısı: 4 0  :  1; 1  :  2; 2  :  3;

3  :  4;

Çalışması ;  program.pl

Argüman sayısı: 0

Programda,  komut satırından girilen değerleri saklayan  @ARGV dizisi elemanları içeriği basılır.

  1. satırda $gosterge referans olarak @ARGV’ye işaretlenmiştir(point). 3. satır ARGV’nin adresini basar. Siz genelde bu adresi kullanmazsınız ama başka bir diziyi kullanabilirsiniz. O dizinin ilk

elemanına erişim için bu adrese ulaşmak kısa yoldur. $gosterge pointer’i dizinin ilk elemanının adresini döndürür. 74 satır scalar () fonksiyonu çağırır ve (skalar değişken tipi ile karıştırmayınız) Dizideki eleman sayısına erişir. @ARGV’ye parametreler geçirilmiştir ama scalar() tarafından istenen $gosterge pointerinin tipini tanımlamak gerekir. Bu sebepten @$pointer kullanarak bir dizi olarak parametre tipi tanımlanır. Bu durumda $gosterge tipi dizi için bir pointerdir. @$pointer in ilk elemanıın adresi bu durumda  $pointer ile elde edilmiş olur. Onun eleman sayıları scalar () ile döndürülür.

 

 

Bileşik dizilerde (hash)  de   \   operatörü kullanılabilir.Aşağıdaki örnekte Bileşik dizilerde kullanımı görelim.

 

Örnek :

#!/usr/bin/perl# bileşik dizi referansları kullanımı%Aylar = (     ’01’, ‘Ocak’,      #    ’01’ => ‘Ocak’,  şeklinde de yazılabilirdi     ’02’, ‘Subat’,     ’03’, ‘Mart’,     ’04’, ‘Nisan’,     ’05’, ‘Mayis’,    ’06’, ‘Haziran’,    ’07’, ‘Temmuz’,             ’08’, ‘Agustos’,     ’09’, ‘Eylul’,    ’10’, ‘Ekim’,    ’11’, ‘Kasim’,    ’12’, ‘Aralik’,    ); $gosterge = \%Aylar;printf “\n Aylar Bileşik dizisinin adresi = $gosterge\n “;foreach $i (sort keys %$gosterge) {     # yukarda $gosterge pointerinin bileşik dizi                                          #gostergesi  olduğu belirtiliyor ve key’ ler (“01″,”02″,….”12”)  # sort() ile sıralanıyor     printf “$i. Ay = $$gosterge {$i} \n”;  # ve bastırılıyor}

 

Çalışması ; program.pl

Aylar Bileşik dizisinin adresi = HASH(0x80c1294)

  1. Ay = Ocak
  2. Ay = Subat
  3. Ay = Mart
  4. Ay = Nisan
  5. Ay = Mayis
  6. Ay = Haziran
  7. Ay = Temmuz
  8. Ay = Agustos
  9. Ay = Eylul
  10. Ay = Ekim
  11. Ay = Kasim
  12. Ay = Aralik

 

 

 

ÇOK BOYUTLU DİZİLERDE REFERANS :

 

Kare, köşeli parantez kullanılır. Genel formatı;

 

$diziReferans->[$indeks]                                       ……..tek boyutlu dizi

$diziReferans->[$indeks1][$indeks2]                     ……..iki boyutlu dizi

$diziReferans->[$indeks1][$indeks2][$indeks3]     ……..üç boyutlu dizi

şeklindedir.

 

Örnek :

#!/usr/bin/perl                        0             1               2,0         2,1     2,2                    3,0                 3,1       3,2$tablo = [‘Siyah’, ‘Beyaz’, [‘Kartal’,’2000′,’YILI’] , [‘ŞAMPİYONU’, ‘Puan’, ‘100’]];print “\$tablo ->[0] = $tablo->[0] \n”;print “\$tablo ->[1] = $tablo->[1] \n”;print “\$tablo ->[2][0] = $tablo->[2][0] \n”;print “\$tablo ->[2][1] = $tablo->[2][1] \n”;print “\$tablo ->[2][2] = $tablo->[2][2] \n”;print “\$tablo ->[3][0] = $tablo->[3][0] \n”;print “\$tablo ->[3][1] = $tablo->[3][1] \n”;print “\$tablo ->[3][2] = $tablo->[3][2] \n”;print “\n”;

 

Çalışması ; program.pl

 

$tablo ->[0] = Siyah

$tablo ->[1] = Beyaz

$tablo ->[2][0] = Kartal

$tablo ->[2][1] = 2000

$tablo ->[2][2] = YILI

$tablo ->[3][0] = ŞAMPİYONU

$tablo ->[3][1] = Puan

$tablo ->[3][2] = 100

 

 

            ALT YORDAMLARA REFERANS :

 

Bir skalar veya dizinin bir maddesine referansla aynı tarzdadır.

Aşağıdaki tipte ifade edilir.

$alt_prog_gosterge = sub {alt yordam bildirimleri} ;Not:   referans tarafından alt yordam çağırmak için aşağıdaki tipte referans kullanmalısınız.&$alt_prog_gosterge( parametreler);

Örnek :

#!/usr/bin/perl  sub arguman_yaz{               my ($d,$d,$f) = @_;    print “$d $e $f \n”;    return $d;};  $a = 1; $b = 2; $c = 4; $ilk  = arguman_yaz($a,$b,$c); printf “\t$ilk\n”; $ikinci  = arguman_yaz(4,5,6); printf “\t$ikinci\n”;

Çalışması ; program.pl

2   4           25   6           5

Çok Boyutlu Dizilerle, Çalışmak İçin, Altyordam Kullanımı :

 

Örnek : #!/usr/bin/perl@isimler = (Ahmet,Bertan,Ertan);@telefonlar = (2126840,2126841,2126842);$say = 0;&aktar_yazdir(\@isimler, \@telefonlar); sub aktar_yazdir{my ($ad,$tel) = @_;foreach (@$ad) {print “ad[$say] = ” . @$ad[$say] . ” ” . “\ttel[$say] = “. @$tel[$say] .”\n”; $say++;   }}  Çalışması: program.plad[0] = Ahmet   tel[0] = 2126840 ad[1] = Bertan  tel[1] = 2126841 ad[2] = Ertan   tel[2] = 2126842

Yorum bırakın