57 - Bul-Deitir Bakasnn yazd metinlerde noktalama...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Bul-Deitir Bakasnn yazd metinlerde noktalama iaretlerinden sonra boluk braklmam olmasna kzar msnz? Ben de! Perl ile metin dzenleme fonksiyonlarndan geriye braktmz ikisi, vereceimiz bir String modelini (pattern) metinde arayan ve bulduklarn deitiren fonksiyonlarla, Perle okuttuumuz metinlerde sadece yazm kurallarn uygulatmakla kalmayz, fakat Form bilgisi iinde sitemizin gvenliini sarsc metin olup olmadn tarayabiliriz; gereksiz karakterleri, rnein yeni satr balatan kodlar atabiliriz. Perln iinde arama ilemi de bulunan split() fonksiyonunu daha nce grmtk. Bu fonksiyona, arayaca nesneyi iki bl iareti (//) arasnda veriyorduk; hangi deikende aramay yaplmasn istediimizi bildiriyorduk; elde ettii sonular yeni bir deikene yazmasn istiyorduk. rnein: @Yeni_degisken = split(/\&/, $Aranan_degisken); Bu deyimle, Perl, $Aranan_degisken adl deikenin iinde, & iaretlerini bulur ve deikeni & iaretlerinden paralara bler; elde ettii her bir paray @Yeni_deiken adl deikenin elemanlar olarak yazar. Perln arama-bulma ii yapan bir dier ilemcisi benzerini-bul (match) m// operatrdr. Dikkat ederseniz fonksiyon deil, operatr (ilem) diyoruz. nk, bu ilem tek bana deil, Perl bir dier ilemi, badatrma/balama ilemi (binding operator) dediimiz =~ iareti ile birlikte kullanlr ve bize doru/yanl sonucunu verir. Balama iareti, solunda deerin iinde sandaki modelin bulunup bulunmadn bildir. Burada sadaki model m// ile belirtilir. rnek yapalm, bu karmak ifade anlalr hale gelecektir: if(dostlar#neredesiniz =~ m/#/) {print Aranan bulundu\n } else {print Aranan bulunamad\n } Ekrana Aranan bulundu yazdracaktr. (dostlar#reredesiniz Stringi yerine isterseniz bir deiken ad da koyabilirsiniz; arama deikenin ierdii deerde yaplr.) Buradaki if doru/yanl sonucu veren bir operatr doru sonu verdii zaman birinci ilemi, yanl sonu verdii zaman ikinci ilemi yapacaktr. Arama sonucu aranann benzeri bulunamazsa, sonucun yanl deil doru olmas iin balama operatrn !~ olarak yazabiliriz. rnek: if(dostlar#neredesiniz !~ m/#/) {print Aranan bulunamad\n } else {print Aranan bulundu\n } Metinlerinizde, Perl iin zen anlam olan u karakterleri aratmak istiyorsanz, iki bl iaretinin arasna bu karakteri yazarken nne ters-bl iareti koymanz gerekir: ^ $ + * ? . | ( ) { } [ ] \ / Bir metinde iki karakterden biri veya dierini aratacanz zaman veya anlamna gelen dik izgi (|) iaretini kullanmanz gerekir. rnein, Perl aranan metinde h veya H harfini arasn istiyorsak, bunu yle yazabiliriz: if($aranan_metin =~ m/(h|)/).. m// operatr ile joker karakterler de kullanabilirsiniz: if($aranan_metin =~ m/T.K/).. Perl, TEK, TAK, TK kelimelerini bulacak fakat mesela TANK kelimesini bulmayacaktr; nk bir adet nokta iareti ile verdiiniz iki karakterin arasnda sadece bir adet karakter bulunmasna izin verdiniz. Perlde aranan modeli belirtmek iin bir ok baka yntem vardr. rnein verdiiniz modelin bulunmasn deil, bulunmamasn istiyorsanz, nne ^ iareti koyabilirsiniz. Bir baka rnek, btn bir snf belirtmek amacyla aranan modeli keli parantez iine almak veya dizileri, 0-9, A-Z, a-z gibi kesme iaretiyle belirtmek olabilir. Fakat bunlarn ounun ksayolu da vardr: Ksayol Ak ekli Anlam \d [0-9] Herhangi bir rakam \w [a-zA-Z_0--] Herhangi bir alfanmerik karakter \s [\t\n\r\f] Herhangi bir yazlmaz karakter \D [^0-9] Rakam olmayan bir karakter \W [^a-zA-Z_0--] Alfanmerik olmayan bir karakter \S [^\t\n\r\f] Yazlmaz olmayan bir karakter Bu ksayollarn kullanmna bir rnek verirsek: if($aranan_metin =~ m/\d/).. deyimi ile metinde herhangi bir rakam bulunup bulunmadn aratabilirsiniz. Ksayollar ve normal ifadeler birlikte kullanlarak, Perln arama yetenei geniletilebilir. Bazen arattmz karakter(ler)in metindeki yeri bizim iin nem tayabilir. ^ iareti vereceimiz karakterlerin aranan metnin banda, $ iareti de sonunda olmasna dikkat edilmesini salar. rnek, aradmz metni Mus harfleriyle balamasn istiyorsak: if($aranan_metin =~ m/^Mus).. Aranan metnin afa ile bitmesini istiyorsak: if($aranan_metin =~ m/afa$).. Bu noktada eer temizlemediyseniz, bir dosyadan okuttuunuz metnin sonunda yeni satr karakteri bulunabileceini hesaba katmalsnz. Perln aranan karakterin ka adet olmas gerektiini belirleyebilmemizi salayan ksayollar vardr: Ksayol Anlam + En az 1 kere veya daha fazla * En az 0 kere veya daha fazla ? 0 veya 1 kere {x} Kesinlikle x kere {x,} En az x kere {x,y} En az x, en ok y kere Bu ksayollar da dier normal ifadeler ve ksa yollarla birlikte kullanlabilir. rnein, H ile balayan ve I ile biten ve arasnda bir veya daha fazla herhangi bir karakter bulunan metinleri bul! demek istiyorsanz, u deyimi yazmalsnz: if($aranan_metin =~ m/H.+I).. Bu deyimle, HAKKI ve HALI bulunur, fakat HI bulunamaz. Aradmz bulduk, diyelim. Elde ettiimiz sonu aranan bulunursa doru (True), bulunamazsa yanl (False) deerinden baka bir ey deil. Peki, iinde aradmz deer bulunan Stringi veya sayy renemez miyiz? reniriz. Perl bulduklarn srayla $1, $2, $2 adl deikenlere yazar. rnek: $Metin1 = HAKKI; if($Metin1 =~ m/(H.)K(.I)/) {print Bulundu\n } else {print Bulunmad\n } print $1\n$2\n; Preln arad metnin byk-harf veya kk-harf olmasna aldr etmemesini istiyorsak, m// ileminden sonra i (ignore) harfini koyarz. Arattmz arama yaplan metinde btn getii yerlerde bulmasn istiyorsak, yani arama yaplan metnin tmnn aranmasn arzu ediyorsak, m// operatrnden sonra g (global) harfini koyarz. Peki, aradmzn sadece bulunup bulunmadn ve ne bulunduunu renmek istemiyoruz; fakat aradmz eyi deitirmenizi istiyorsak! Bunu s/// ilemine (substitute, yerine koy) ile yaparz. alma ilkesi tamamen m// ilemkine benzeyen s///, ikinci ve nc bl iaretleri arasna koyacamz eyleri, bulduklarnn yerine koyar. Szgelimi elimizdeki metinde geen btn + iaretlerini boluk (aralk) ile deitirmek istiyoruz: $Bosluklu_degisken = ($Artili_degisken =~s/\+/ /); s/// ileminin de ileyiini deitiren bir ok eki vardr. Bundan e (evaluate, deerlendir), eer bulunan unsurun yerine konulan unsur bir hesap veya bir deiken ieriyorsa, bu deerlendirmenin yaplmasn salar. $yeni_degisken =~ s/\d+/$1 + 1/e; Perl, bu deyimle, bulduu unsur diyelim ki 135 ise, annda 136 yapar. Her ne kadar kullanl olsa da, s/// ilemi sadece bir unsuru bir baka unsura evirdii iin, bazen yetersiz kalabilir. Bize btn deikende, sz gelimi btn byk harfleri kk harf yapacak, bir ilemci gerekebilir. Bu ilemci, tr/// operatrdr. Ve ite arzu ettiimiz byk harf-kk harf deilikliini yapma deyimi: $yeni_degisken =~ tr/A-Z/a-z/; Bu ilemin ileyi tarzn ve sonularn, ekilde deitirebiliriz: c: seilmeyenleri deitir: $yeni_degisken =~ tr/0-9/ /c; Bu deyim, rakam olmayan hereyin yerine boluk koyar. d: deitirme, sil: $yeni_degisken =~ tr/0-9//cd; Bu deyim, rakam olmayan hereyi siler. s: tekrar edenleri teke dr: $yeni_degisken =~ tr/,/,/s; Bu deyim, yanyana birden fazla virgl tek virgl haline getirir. ...
View Full Document

Ask a homework question - tutors are online