Bu yazıda 2 tür ifade göstereceğiz. İlki eşitlik/benzerlik (match) operatörü, ikincisi arama ve değiştirme operatörü (search/replace). Eşitlik/benzerlik operatörü iki slash arasında kullanılır. Bu slash’ların önünde “m” yer alır.
m/ifade/
Çoğu programcı bu öndeki m ‘i kullanmaz. Çünkü Perl Perl 2 tane slash gördüğünde onun bir ifade gösterdiğini bilir. Örnek verelim, bir dosyada ismimi arıyorsak, kod’un şöyle olması gerekir.
my $counter = 0;
while (<>) {
$counter++ if m/Jonathan/gi;
print "Found 2001 $counter timesn";}
Eğer bu script’in belli bir dosya içinde arama yapmasını istiyorsak, dosyanın adını vermemiz lazım. Bunu yönlendirme operatörü olan < ile yaparız.
match.pl < index.html
Bu script index.html dosyasındaki her satırı okuyarak adımı araştıracak ve iİsmimi bulduğu zaman $counter saydıracaktır. Script tüm satırları bitirdiğinde Jonathan adını kaç kere bulduğunu yazacaktır.
Tanmlamanın arkasında kullanılan iki karaketer vardır. (g ve i). Bunlara modifier denir. Özel bir anlamları vardır ve tanımın çalışma şeklini değiştirir. g modifier’I Perl’e herhangi bir yerde adımı bulsa bile aramaya devam etmesini söyler. Global Modifier olarak da adlandırılır. Aranan kelimeyi kaç kere bulursa bulsun, devam etmesini sağlar. Aksi takdirde kelimeyi ilk bulduğunda arama işlemi sona erecekti. İkinci modifier , i, Perl’e arama yapılırken büyük-küçük harf ayrımı yapmamasını söyler. Bu durumda başharfi büyük J olmayan bir JONATHAN bulsa bile sayılacaktır. Ya da adım tamamen büyük harfle yazılsa bile, bulmuş olacaktır.
Perl’ün normal ifadeleri, bize, kelimeleri, digitleri yada aralıkları temsil eden özel karakterler kullanmamıza da müsade eder. Bu karakter sınıflarını ters slash ve karakter olarak kullanılır. Alfanümerik karakterler için w, sayılar için d, boşluklar için s kullanılır. Alfanümerik karakterler a dan z’ye kadar harfleri ve 0 dan 9’a kadar rakamları temsil ederler. Bu özel karakter sınıfları, bir ifadeyi oluştururken, ifadeleri kısaltmamıza yardımcı olur. Mesela, insanlar bazen adımı Jonathan yerine Jon olarak kullanırlar. Bu durumda, eğer adım Jon olarak kullanılmışsa gözden kaçacaktır. O halde bunu da yakalamanın bir yolu olmalıdır. Yukarıdaki ifadeyi şöyle değiştirelim.
$counter++ if /Jon(wwwww)?/gi;
Şimdi, Jon ve ondan sonra 5 karakter arayacak bir ifade yazmış olduk. Burada yeni bir şey daha var, karakterler parantezlerle çevrişmiş durumda ve en sonunda bir soru işareti var. Soru işareti parantez içindeki sayıdaki kadar karakter bulmamızı yönetir ki bu nedenle “miktar belirleyici (qualifier)” olarak tanımlanır. Soru işareti, miktar belirleyici olarak doğru miktarı ya da yanlış miktarları bulmakta kullanılabilir. 2 başka miktar belirleyici vardır. + ve *. + ifadekinin 1 veya daha fazla olduğunu gösterir. * ise 0 ve daha çok olduğunu. Miktar belirleyici solundaki ifadeyi yönetir. Bizim örneğimizde, bu parantezin içindeki ifadedir. + Miktar belirleyicisini kullanmanın bir yolu şöyledir;
$counter++ if /Jon(w+)?/gi;
Yukarıdaki ifade, Jon ve Jon’a 1 ya da daha fazla karakter eklenmiş kelimeleri bulacaktır. Bunu * ile yazarsak.
$counter++ if /Jonw*/gi;
Miktar belirleyicisi, w karakterinden sonra yerleştirilmiş. Bu sadece Jon ya da arkasına bir kaç karakter eklenmiş kelimeleri bulacaktır. Ancak burada başka bir sorun var. Her iki yöntem, Jonathan dışında bir kelime de bulabilir. Karakterlerin tam sayısını belirleyecek yol şudur.
$counter++ if /Jon(w{5})?/gi;
Bununla Jon veya Jon+5 karakteri bulacaktır. Bu da tam istediğimiz sonucu vermeyebilir. İsim Jonothon olarak bulunabilir. Tam doğrusunu bulmak için, aradığımız karakterlerin kendisini belirtebiliriz.
$counter++ if /Jon(athan)?/gi;
Şimdi oldu. Şimdi ya Jon ya da Jonathan bulacak. Ancak bazen insanlar benim adımı farklı telafuz edip, sonunu AN yerine ON ile bitirebiliyorlar. Bu yanlış yazılmış isimleri de bulmak isteyeceğiz. Bu nedenle, bilinen karakter sınıflarını eklemmemiz gerekir. Yukarıdaki özel karakterler Perl’ün iç kullanımındaki sınıflar ama biz ayrıca ifade içinde, kelimenin içerdiği harfleri kullanabiliriz. Bu durumda köşeli parantezler kullanılır.
$counter++ if /Jon(ath[ao]n)?/gi;
Böylece yukarıdaki ifade, Jon, Jonathan ya da Jonathon’u bulacaktır. Gördüğünğz gibi ifadeler bize istediğimizi vermekte son derece esnek ve güçlü. Bu ifadeler düşündüğünğz herşeyi yapabilmenize olanak sağlıyor. Daha sonra sizlere XML ‘de yazılmış çok karmaşık bir ifadeyi göstereceğim.