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