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

               #!/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.

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 :

#!/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)

 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 :

#!/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 
          2
5   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.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:

 

#!/usr/local/bin/perl

 *name2 = *name1;

 $name1 = 14;

 print ("$name2\n");

çalıştır

14

 

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