Etiketler

Youtube Kanalıma Abone Olunuz

6 Ocak 2008 Pazar

Perl'de Regular Expressionlar 3

Yazının 2. Bölümü

Hafızadaki ifadenin sonucu değişkene

İfadeyi parantez içine alarak hafızaya alabiliyoruz fakat bunu başka bir komut satırında \1 kullanarak ifade edemeyiz

/-?(\d+)\.?(\d+)/ 
ile bir küsürlü sayı arattırabiliriz. başka bir satırda

/\1/
kullanmak doğru olmayacaktır. Hafızadaki ifadenin sonucunu nasıl alırız?. Perl in dahili değişkenleri vardır $1 $2 ... gibi $1 ilk hafızaya alınmış ifadenin sonucunu tutar, $2 sonraki ... gibi. Metin içinde geçen küsürlü sayıyının tam sayısını ve küsuratını alan kod
$metin = "Bu metinde 23.415 sayısı var";
$metin =~ /-?(\d+)\.?(\d+)/;
print "Tam sayı : $1\n";
print "Küsuratı : $2";
$1 $2 nin değerleri yeni bir ifade kullanılana kadar hafızada kalır. Yeni bir ifade kullanıldığında bu değerler kaybedilir. kaybetmek istemezseniz başka bir değişkene aktarabilirsiniz
Html kod içinden sayfa başlığı metnini alan kod

$htmkod = "<html><head><title>Perl hakkında</title></head></html>";
$htmkod =~ /<title>(.*)<\/title>/;
print "Başlık = $1";
Diğer bir Perl dahili değişkeni de $& dır. Bu, son ifadenin sonucunu hafızada tutar
$metin = "Bu metinde -45.15 sayısı var";
$metin =~ /-?(\d+)\.?(\d+)/;
print "Sayı = $&";

Özel karakterlerin öncelik sırası

Nasıl bir matemetiksel işlemde * ve / öncelikli olarak işleme konursa perl ifadelerinde de özel karakterlerin öncelik sırası vardır. Aşğıdaki tablo öncelik sırasını verir
Özel karakterTanımı
()Hafızaya alma
+ * ? {}Tekrar etme
^ $ \b \BBaşlangıç, bitiş
Alternatifler

İfadeyi sınırlayan karakteri belirleme

ifademizi sınırlamak için / işareti kullanıyoruz. İfademizin içinde /usr/local/webpages/mesut/web geçecekse aynen kullanamayız çünkü / özel bir karakter. Bunu

/\/usr\/local\/webpages\/mesut\/web/
olarak yazabiliriz. Ancak hem kod artıyor hemde okunurluk zorlaşıyor. Perlde buna da bir çare getirmişler sınırlayan karakteri m ile kendimiz belirleyebiliyoruz

/abc/
yerine

m!abc!
kullanabiliriz. çünkü m nin ardından sınırlama karakterini ! olarak belirledik Eğer ifade içinde sınırlama karakteri kullanacaksak \ ile beraber kullanmalıyız.

m!ab!cd!
yanlış olacaktır. Yerine

m!ab\!cd!
yazabiliriz. Şimdi

m!/usr/local/webpages/mesut/web!
ile daha anlaşılır bir kod oldu.

Düzenli İfade Seçenekleri

İfade seçenkleri bir harf ile belirtilir ve son sınır karakterinden sonra kullanılır. Örnek

/a[bc]d/i
Seçenekler tablosu
SeçenekAçıklama
gGeçerli tüm veriler
iBüyük/küçük harf ayırımı yapma
mMetnin çok satırdan olduğunu varsay
oYalnız bir defa
sTek satırmış gibi değerlendir
xBoşlukları yoksay(dikkate alma)

g seçeneği

Veride ifadeye uyan tüm veri parçalarını alır. Örnek

/.a/g
metinden 1. harfi herhangi bir harf 2. harfi a olanları arar
@parcalar = "salata" =~ /.a/g;
foreach $p (@parcalar){
 print "$p\n<br>";
 }
başka bir örnek
while ("kelebek" =~ /.e/g){
 $m = $&;
 print ("$m\n");
}

Aramaya başlanacak yeri belirleme

pos komutu ile metnin belli bir kısmından itibaren arama yaptırabiliriz. Kullanımı
pos($metin) = arama pozisyonu;
Örnek:

$metin = "kelebek ve melemen";
pos($metin) = 7;
while ($metin =~ /.e/g){
 $parca = $&;
print ("$parca\n");
 }

Sonuç:

ve
me
le
me
olacaktır. 7. karakterden itibaren aradığı için kelebek kelimesi dikkate alınmadı. Dikkat : ilk karakter 0 olarak alınır. pos komutu Perl4 de yoktur.

i seçeneği

Metin içinde arama yapılırken büyük/küçük harf ayırımı yapılmaz.

/ab/i
Ab ab aB AB bu tanıma uygundur

m seçeneği

metnin çok satırdan oluştuğunu belirtir. Bu seçenek yalnız Perl5 de kullanılabilir. Örnek:

$metin = "Güzel Bir Gün. \nBir gün...";
print "Bir ile başlayan satır ";
if ($metin =~ /^Bir/m)
 {print "var";}else{print "yok";}
Yukardaki kodda m harfini silerek yada metin içindeki \n i silerek deneyin. \n yeni satır başlangıcını belirtir.

x seçeneği

Perl5 de kullanılabilir. ifadedeki boşlukları dikkate almaz

/\a  [bc]  \d  AD/x
ifadesi

/\a[bc]\dAD/x
gibi değerlendirilir

Yerine koyma operatörü

Bir metindeki belirtilen ifadeye uyanları başka bir şeyle değiştirmek için kullanılır.
s/arama ifadesi/yerine konacak/
Örnek
$metin = "Ali Ve Veli"; $metin =~ s/Ve/de/g; print $metin;
Sonuç : Ali de deli Çünkü Bulunan ve lerin de ile değişmesini istedik. g seçeneği tüm bulunanları değiştir. Daha önceki öğrendiğimiz ifade kuralları burada da geçerlidir.
$metin = "AAli Veeee Veli"; $metin =~ s/[ae]+/,/ig; print $metin;
kodlarını çalıştırın neyi değiştirdiğini inceleyin.
Yerine koyma operatörü seçenekleri
SeçenekAçıklama
gBulunanların tümünü değiştir
iBüyük / küçük ayrımı yok
eİfadenin değerini alıp değiştir
mÇoklu satır
oYalnız bir kere
sTek satır
xİfadede boş karakterleri önemseme
Seçenekleri daha önce açıklamıştık Birkaç örnek:

$metin = "Bu metin\nçok satırdan\noluşuyor";
$metin =~ s/\n/ /g;
üstteki kodlar metindeki \n leri boşluk ile değiştirir. Böylece çok satırlı metin tek satırlı olur

$metin = "Bu  \r\r   metin\n\n\n çok   satırdan\n
         oluşuyor ve       gereksiz boşluklar var";
$metin =~ s/[\n\r\t ]+/ /g;
print $metin;
üstteki kodlar metindeki 1 veya daha fazla \r \n \t ve boşluğu tek boşluk ile değiştirir. \n = yeni satır, \r satır atla, \t tab karakteridir.

s/\.//g
üstteki kod metindeki noktaları siler. // ile yerine birşey koyma demek istedik. Yani sil.

$sayi = "105";
$sayi =~s/(\d)/$1*5+1/eg;
print $sayi;
e seçeneği, yerine konacak olanın önce hesaplanıp değerinin yerine konacağını belirtir. Kodları inceleyelim (\d) ile herhangi bir rakam diyoruz ve parantez içine alarak hafızaya almasını istiyoruz $1*5+1 ile de bulunan sayıyı 5 ile çarp 1 ekle sonra bulduğun ile değiştir diyoruz. ilk bulduğu rakam 1. Bunu 5 ile çarpıp 1 ilave edince 6 2. rakam 0. Bunu 5 ile çarpıp 1 ilave edince 1 3. rakam 5. Bunu 5 ile çarpıp 1 ilave edince 26 Sonuç: 6126
/ nün yerine farklı bir ifade sınırlayıcı belirleyebilirsiniz.
s%ab/cde%123/45%g;
ab/cde yi 123/45 ile değiştir dedik. sınırlayıcı karakter %

Çeviri operatörü

Bir grup karakterin başka bir grup ile değiştirmesi için kullanılır. Kullanımı
tr/grupkarakterler/yerine konacak grupkarakterler/
Örnek:

$metin = "Dağ başını duman almış. Çöl rüzgarı";
$metin =~ tr/ğşıöü/gsiou/;
print $metin;
Metindeki ingilizcede olmayan karakterler benzerleriyle değiştirilir.

tr/[A-Z]/[a-z]/
Tüm büyük harfler küçükleriyle değiştirilir. Dikkat İngilizcede olmayan karakterleri dikkate almaz.
Dikkate alması için

tr/[A-Z]ÜĞİŞÇÖ/[a-z]üğişçö/

Çeviri operatörü seçenekleri

SeçenekAçıklama
cBelirtilmeyen tüm karakterler değiştirilir
dBelirtilen tüm karakterleri sil
sÇok sayıdaki karakter tanımlandı ise hepsini 1 karakterle değiştirir

tr/A-Z/ /c
büyük harfler hariç hepsini boşluk ile değiştirir

tr/a-z/ /d
küçük harfleri siler

tr/ÜĞİŞÇÖ/?/s
Büyük harfli Türkçe karakterleri soru işareti ile değiştirir.
BÜYÜK -> B?Y?K olur DÜĞÜN -> D?N olur. Çünkü ÜĞÜ tekbir karakterle değiştirilir.

Birkaç Örnek:

s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg
% ile başlayan ([a-fA-F0-9][a-fA-F0-9]) a dan f ye kadar veya A dan Z ye kadar veya 0 dan 9 a kar olan 2 karakter ve bunu hafızaya al. pack("C", hex($1)) pack komutu verilen sayıyı değişik formatlara dönüştürür. Burada, verilen 16 lık sayıyı karaktere dönüştürür. Seçenek olarak e kullanıldığına dikkat edin. e ifadede bir işlem var ise onun yapılıp da değişikliğin yapılacağını belirtir.
Bu kod tahmin edeceğiniz gibi formdan gönderilen 7 bitlik verileri 8 bite dönüştürür. Örneğin formda ş yazdığımızda bu bilgi 8 bitlik olduğundan ascii karakter kodu hex olarak gönderilir. Diğer karakterlerden ayırmak için de başına % işareti konur. Yani ş karakteri %FE ye dönüşür. Bu da üstteki perl kodu ile tekrar ş ye dönüştürülür.
2. örnek:

if ($email !~ /\w+@\w+\.\w\w+/){$email="";}
email adresi doğru formatta yazılmamışsa $email değişkeni sıfırlanır \w ifadesi [_0-9a-zA-Z] e denk gelir.
3. örnek:

if ($fweb !~ /^(fht)tp:\/\/\w+\.\w\w+/){$fweb = "";}
web adresi formata uygun değilse kabul etmez.
4. örnek

if ($metin =~ /\S{41,}/g){print "metinde 40 karakterden uzun kelime var";}
formda yazılmış anlamsız kelimeler giren olursa uyarmanız için.

Hiç yorum yok:

Yorum Gönder