Site Renkleri

Perl Dersleri

Perl de Dosya Taramaları



Perl dili öncelikle dosya taramalari yapmak üzere gelistirildi. Bir önceki bölümde dosyalarla nasil calisabilecegimizi ögrendik. Perl'ün yetenekleri bununla sinirli degil. Perl ve diger dillerde regüler terim olarak isimlendirilen harf ve kelime gruplariyla bir metni taramamiz mümkündür.
Bu bölümde regüler terimleri inceleyecegiz. Bu terimleri kullanarak, dosyalar üzerinde ne kadar kolay tarama yapabileceginizi göreceksiniz. Regüler terimler dogru kullanildigi taktirde, isimizi kolaylastiracak cok kuvvetli araclardir. Dilerseniz artik regüler terimlerle tanisalim.
Regüler terimler, bir dosyanin icinde gecen kelime ve kelime gruplarini bulmak icin kullanilir. Asagidaki örnegi inceleyelim:

$var="Bugün hava cok güzel. Arkadaslarla sinemaya gidecegiz.";
if($var = ~ /cok/)
{
print "Cok kelimesi kullaniliyor\n";
}

$var degiskeni bir string ihtiva ediyor. If döngüsünü kullanarak, cok kelimesinin string icinde kullanilip, kullanilmadigini kontrol ediyoruz. /cok/ burada kullanilan regüler terimdir. Regüler terimler iki / / isareti arasinda yer alir. Eger aradigimiz regüler terim $var stringi icinde yer aliyorsa, ekranda "Cok kelimesi kullaniliyor" mesajini görecegiz.
Bazen icinde aradiginiz regüler terimin bulunmadigi bir dosyayi taramak isteyebilirsiniz. Bu is icin asagidaki örnegi kullanabilirsiniz: NOT (!) operatörünü kullanarak, regüler terimin string icinde bulunmamasi gerektigini belirtiyoruz. If döngüsü, string icinde aradigimiz regüler terimin olmamasi durumunda print komutunu calistiracaktir.

$var="Bugün hava cok güzel. Arkadaslarla sinemaya gidecegiz.";
if($var !~ /Tiyatro/)
{
print "Tiyatro kelimesi kullanilmiyor\n";
}

Tarama yaparken regüler terime opsiyonlar (flags) verebiliriz. Kullandigimiz opsiyona göre, regüler terimin, tarama sürecinde davranisi degisik olacaktir.
Tarama yaparken büyük/kücük harf ayrimi yapmak istemiyorsaniz, i opsinonunu kullanin.

$var="Bugün hava cok güzel. Arkadaslarla sinemaya gidecegiz.";
if($var= ~/Cok/i)
{
print "Aradiginiz kelime mevcut.\n";
}

Genelde regüler terim taramalari ilk satir üzerinde yapilir. $var degiskeni icindeki string birden fazla satirdan olussaydi, yukarda yer alan programlar, diger satirlarda belki yer alabilecek regüler terimi bulamiyacaklardi. Tüm satirlarda tarama yapmak icin m opsiyonunu kullanabilirsiniz.

$var=" Bugün hava cok güzel.\n Arkadaslarla sinemaya gidecegiz.\n Cok güzel bir gün olacak\n";
if($var= ~/cok/im)
{
print "Aradiginiz kelime mevcut.\n";
}

S opsiyonunu kullanarak, satir icinde bulunan regüler terimi baska bir kelimeyle degistirmeniz mümkün. Asagida yer alan örnekte cok kelimesi cok cok kelimeleriyle degistirilecektir. Yeni cümle "Bugün hava cok cok güzel" olacaktir. g (global) opsiyonu ile cümle icinde birden fazla bulunan regüler terimi ayni anda degistirebilirsiniz. g opsiyonunu kullanmadiginiz taktirde bulunan ilk regüler terim degistirilecektir. Diger uyan regüler terimler degistirilmez.

$var="Bugün hava cok güzel.\n"
if($var= ~/cok/)
{
$var=~ s/cok/cok cok/g;
}
print $var;

Eger string icinde bulunan bir kelimeyi silmek istiyorsaniz, s opsiyonunu asagida yer aldigi sekilde kullanabilirsiniz.

$var="Bugün hava cok güzel.\n";
if($var= ~/cok/)
{
$var=~ s/cok/ /;
}
print $var;

Daha önceden tanidigimiz i opsiyonunu kullanarak, büyük/kücük yazimi göz ardi edebilirsiniz. Asagidaki örnekte "bugün" kelimesi aranarak, cümle icinden silinmektedir.

$var=" Bugün hava cok güzel.\n";
if($var= ~/bugün/i)
{
$var=~ s/bugün/ /g;
}
print $var;

Kapsamli arama yapmak icin regüler terimlerde özel anlam tasiyan isaretler kullanabiliriz. Bu isaretleri kisaca taniyalim:

. : herhangi bir harf/isaret anlamina gelir.
[abc] : a, b ya da c.
[a-z] : a dan z ye kadar bir kücük harf.
[^a-f] : a dan f kadar harf gurubu disindaki herhangi bir kücük harf.
\w : harfle baslayan herhangi bir kelime.
\W : harfle baslamayan herhangi bir kelime.
\s : iki kelime arasindaki bosluk.
\d : 0 ila 9 arasinda herhangi bir sayi.
^ : satir baslangici.
$ : satir sonu.
(abc|de): abc ya da de iceren bir kelime (ikisinden birisi).
reg* : reg olarak aranan regüler terimin bir, berden fazla ya da 0 kere kullanilmasi.
reg+ : reg olarak aranan regüler terimin bir veya birden fazla kullanilmasi.
reg? : reg olarak aranan regüler terimin 0 ya da bir kere kullanilmasi.

Belirli bir harfi ya da rakami ariyorsaniz /./ kalibini kullanabilirsiniz. . (nokta) sadece bir harf ya da rakam yerini tutar.

if($var=~/./) # En az bir harf/rakamdan olusan kelimeleri bulur.
if($var=~/...../) # En az bir 5 harf/rakamdan olusan kelimeleri bulur.
if($var=~/[A-Z]../) # Ali, Bil, Kül gibi kelimleri bulur. Büyük bir harfi iki harf/rakam takip eder.
if($var=~/[A-Z].[0-9/) # Büyük bir harf ve bir rakam arasinda herhangi bir harf/rakam olan kelimeleri bulur # Ax1, B23, Cy9 kelimelerini bulur.

Regüler Terimler - Alternatifler:
Alternatifleri kullanarak, tarama sirasinda birden fazla regüler terim kullanabilirsiniz. Listede bulunan terimlerden biri bulunana kadar, tarama islemi sürdürülür.

if($var=~/ahmet|mehmet|veli/) { print "OK"; } # $var icinde adi gecen herhangi bir ismi arar.

Regüler Terimler - Tekrarlar:
Kivantör (quantor) olarak isimlendirilen *, ?, + isaretleri kullanarak, bir kelime icinde arka arkaya kullanilan harf veya rakam gruplarini lokalize edebilirsiniz.

* operatörü ile bir harf/rakami 0, 1 yada birden fazla lokalize edebilirsiniz.
if($var=~/[A-Z]*/) # Büyük bir harfle baslayan tüm kelimeleri bulur.
if($var=~/[a-z]*[0-9]/) # 0, 1 ya da 1 den daha fazla ufak harften sonra bir rakam ihtiva eden tüm kelimeleri bulur. a1, aaaaa3, bbbbb5.......
+ operatörü ile bir harf/rakami en az 1 yada birden fazla lokalize edebilirsiniz.
if($var=~/[A-Z]+\d/) # En az 1 ya da daha fazla büyük harften sonra bir rakam iceren kelimeleri bulur. # A3, B4......
? operatörü ile bir harf/rakami 0 yada en fazla 1 defa lokalize edebilirsiniz.
if($var=~/A?/) # $var icinde ya hic A yok ya da sadece bir tane A var.
if($var=~/[A-Z]?/) # $var icinde ya büyük harf yok ya da iki tane büyük harf yan yana degil.

Daha önce ekran cikisi yapabilmek icin print() fonksiyonunu kullandik. Program icinde kullanilan degiskenlerin sahip oldugu degerler degisik uzunlukta oldugu ve degiskenlerin degerleri program süresince degistigi icin, ekran cikislarini print() fonksiyonu ile formatlamak zor olacaktir. Printf() fonksiyonunu kullanarak ekran cikisini istediginiz sekilde formatlayabilirsiniz.

printf("%d %s %03d\n", 1224, "Merhaba", 1); # Ekran cikisi: "1224 Merhaba 1"
printf("(%-20s)\n(%20s)\n", "Merhaba arkadaslar", "Nasilsiniz?");

Printf() fonsiyonu icinde kullanabileceginiz özel isaretler:

\a Alarm.
\b Backspace.
\f Form Feed - Yazici üzerinde yeni bir sayfa.
\n Newline - Yeni satir.
\r Carriage Return - Yeni satir yapmadan satir basi.
\t Yatay Tab - Bir sonraki yatay tabülator pozisyonuna gider.
\v Dikey Tab - Bir sonraki dikey tabülator pozisyonuna gider.

Perl programlariniza HERE dokümani cercevesinde print() fonksiyonunu kullanmadan text pasajlari ekleyebilirsiniz. Böylece her satir icin print() fonksiyonunu kullanmak zorunda kalmiyacaksiniz. Kitabin CGI bölümünde de görecegimiz gibi, HERE dokümanlari kullanilarak, CGI programlarina HTML sayfa kodlari eklenir.

print << TEXT;
Merhaba Arkadaslar,
bugün sinemaya gitmeye ne dersiniz?
Bugün hava cok güzel.
TEXT
$var = << TEXT;
Merhaba Arkadaslar,
bugün sinemaya gitmeye ne dersiniz?
Bugün hava cok güzel.
TEXT
print $var;

HERE dökümanlari << operatörü ve HERE ismiyle baslar. Dikkat edilmesi gereken husus, << ISIM den sonra noktali-virgül kullanilmasidir. Istenilen pasaj eklendikten sonra, HERE ismi tekrar yazilarak, HERE döküman cercevesinin kapatilmasi gerekmektedir. HERE ismini yazdiktan sonra, noktali-virgül yazmiyoruz.
En son satirda yer alan Here isminin mutlaka satir basinda yeralmasi gerekiyor. Aksi taktirde, Perl derleyisi Here dökümaninin sonunu bulamadigi icin, hata mesaji verecektir.

Web Tasarımı | Site Tasarımı | Bilgisayar Dersleri | Hosting | Domain