Etiketler

AutoCAD (54) bedava (46) Resim (33) Dosya (31) program (21) Ziyaretçi Defteri (20) excel (18) asgbookphp (16) Güncelleme (15) Şablon (15) Qbasic (14) php (14) Eğitim (13) Nasıl yapılır (13) online (13) Freeware (12) PHP script (12) Fotoğraf (11) Kaynak kod (10) SolidWorks (10) Dos (9) Photoshop (9) VBA (9) Visual Basic (9) ürünler (9) E-book (8) tutorial (6) Ders (5) Word (5) Lisp (4) Programlama (4)

6 Ocak 2008 Pazar

Perl'de Regular Expressionlar 3


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

Related Posts Plugin for WordPress, Blogger...