İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır

REFERANSLAR

Giriş

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 %$gosterge gö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 alabilirsiniz hatta $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 :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/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ı ;

$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 :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/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ı ;

Argüman sayısı: 0

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

2. 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 :

Çalışması ; program.pl

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

 01. Ay =  Ocak 

02. Ay =  Subat 

03. Ay =  Mart 

04. Ay =  Nisan 

05. Ay =  Mayis 

06. Ay =  Haziran 

07. Ay =  Temmuz 

08. Ay =  Agustos 

09. 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 :

Göster Gizle Kopar Satır Gizle Satır Göster

Ç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 :

dir skalar veya dizinin bir maddesine referansla aynı tarzdadır. Aşağıdaki tipte ifade edilir.

$alt_prog_gosterge = sub {alt yordam bildirimleri} ;

referans tarafından alt yordam çağırmak için aşağıdaki tipte referans kullanmalısınız.

&$alt_prog_gosterge( parametreler);

Örnek :

Çalışması ; program.pl

2   4 
          2
5   6 
          5

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

Örnek :

Göster Gizle Kopar Satır Gizle Satır Göster
#!/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.pl

ad[0] = Ahmet   tel[0] = 2126840

ad[1] = Bertan  tel[1] = 2126841

ad[2] = Ertan   tel[2] = 2126842

Değişkenlerde alias kullanımı

Aşağıdaki tanımı inceleyelim.

sub altprogram1 { 

            local (*altdizi) = @_; 

            $dizi_uzunlugu = @altdizi; 

}

altprogram1 içindeki *altdizi tanımı perl' e der ki: Gerçek liste üzerinde işlem yapmak yerine kopya yap. Bu altyordam, &altprogram1(*altdizi2); gibi bir ifadeyle çağırılınca perl, altdizi ile altdizi2'nin aynı dizi değişkene başvurmasını gerçekleştirir. Bir isim alias olarak verildiğinde, o ismi taşıyan tüm değişkenler alias kullanarak başvurmuş olurlar. Bu demektir ki,bu örnekte @altdizi ve @altdizi2 aynı diziye başvururlar. Şu iki ifade,

altprogram1(*altdizi); 

local (*altdizi2) = @_; 

şu ifadeye eşittir;

local (*altdizi2) = *altdizi; 

her bir durumda, altdizi isminin alias' ı olarak altdizi2 tanımlanmıştır. Çünkü altprogram içindeki local tanımı *altdizi2 içerir ve altdizi2 ve altdizi sadece altprogram çalıştığında eşittir. Bir isim için şöyle bir alias tanımlarsak;

*altdizi2 = *altdizi;  

ve bu ifade ana programın bir bölümünde ise, altdizi2, altprogramlar dahil tüm programda altdizi için bir alias olur. $altdizi2, @altdizi2 ve %altdizi2 (eğer tanımlıysa) değerleri kaybolur. Örnek programa bakalım:

Göster Gizle Kopar Satır Gizle Satır Göster
#!/usr/local/bin/perl 

 *name2 = *name1; 

 $name1 = 14; 

 print ("$name2\n");

çalıştır

14 

alias kullanımı karışık olduğundan kesin emin olmadıkça kullanılmamalıdır onun yerine değişken adını bir stringe koyup eval ile çalıştırmak tercih edilebilir. Örneğin;

$isim2 = '$isim1'; 

eval ("$isim2 = 14;");          # $isim1 içeriği 14 ' dür. 

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır