Tuesday, October 31, 2006

Perl İle Kod HeykelTraşlığı - 2

Bir önceki Perl ile kod heykeltıraşlığı yazımızda, kaynak kodunu satır satır işlemeyi öğrenmiştik.

Fakat Java gibi bir dilde çoğu zaman, "mantıki anlamda" bir satır, metin dosyası üzerinde birçok satıra dağılmış olabilir. Aşağıdaki gibi:

import com.sirket.paket.vs;

if (bilmemne)
soyle boyle;

soyle boyle;

if (filan)
soyle boyle oyle;

Bu dosya üzerinde, yapacağımız değişim şöyle olabilir: "sadece if komutunu içeren mantıki satırlar içinde bütün şöyle böyle ibarelerini, böyle şöyle yapalım". Bu gibi durumlarda, eğer tek satırlı işlem yapma tekniğini kullanıyorsak, if ve şöyle böyle kelimelerinin ayrı satırlarda olması sebebiyle, her ikisini de kapsayan bir düzenli ifade yazmamız mümkün olmayacaktı. Bu yüzden, Perl'ün çok satırlı işleme özelliğini kullanmamız gerekecek.

Hattâ daha da ileri giderek şu tavsiyede bulunacağız: Her türlü kaynak kod değiştirme projeniz için çok satırlı işlemi kullanın. En basit ve en zor şartları halledebildiği için olağan seçenek olarak çok satırlı işlem en iyisidir.

Nasıl

Bütün dosyayı aynı anda işleyebilmek için, dosyanın tümünü bir Perl değişkenine atamamız gerekiyor.

open GIRDI, "girdi.txt";

undef $/;
$_ = <GIRDI>;


Bu ifadeler ile işlenecek dosyayı açtık. undef $/; ifadesi, Perl'e çok satırlı işlem yapmasını söylüyor.

Şimdi, çıktı dosyasını açalım.

open CIKTI, ">cikti.txt";


Ve düzenli ifadeyi işletelim.

s/\;(.*?)if (.*?) soyle boyle(.*?)\;/\;$1if $2 boyle soyle$3\;/sg;


Bu düzenli ifade, hem bulma, hem değiştirme işlemini aynı anda yapıyor. İfadenin uyum kısmında en başta ve en sonda bulunan ; işaretine dikkatinizi çekerim. Bu karakterlerin kullanılış sebebi, satır sonu kavramı kalmadığı için (satır satır değil, tüm dosyayı bir kereden işliyoruz), yeni satır başı ve sonu için en uygun karakterin ; olmasıdır. Bu işlediğiniz dile göre değişik olabilir. Java dilinde her komut ; işareti ile bittiği için, bu karakterler arasında düşen her şeyi bir komut olarak kabul edebilmesi normâl olacaktır.

Ve bu tek düzenli ifade, değişikliği yaptı bitirdi bile. İşlenmiş sonuç $_ içinde bulunuyor. Perl sessiz değisken olan $_ 'nın özelliklerinden önceki yazıda da bahsetmiştik. Hiçbir değişken tanımlanmadığında o anki işlemi Perl otomatik olarak $_ üzerinde yapıyor.

Geriye bu işlenmiş değişkeni dosyaya yazmaktan başka birşey kalmıyor.

# yaz
print CIKTI;

# dosyaları kapat
close GIRDI;
close CIKTI;

No comments: