{940}{1002}-Yes, sir.|-l got a little grease in this lining. {1005}{1097}lt'll take a half-hour to check it.|You want me to fill her up, too? {1105}{1172}-You better check the oil, too.|-Yes, sir.Görünüşe göre oldukça basit bir yapısı var, her satır süslü parantezler içinde altyazının ekrana geldiği ve çıktığı kare numaralarını ve gösterilecek olan altyazıyı içeriyordu.
Bu yaptığımız işlemi biraz da örnek üzerinde göstermekte fayda var. Mesela elimdeki üç altyazı sırasıyla, thehustler1.sub, thehustler2.sub ve thehustler3.sub olsun.
thehustler1.sub
{940}{1002}-Yes, sir.|-l got a little grease in this lining. {1005}{1097}lt'll take a half-hour to check it.|You want me to fill her up, too? {1105}{1172}-You better check the oil, too.|-Yes, sir. ... {62465}{62535}At that hour, you haven't got much choice. {62577}{62655}Besides, l only live three blocks from there. thehustler2.sub {77}{112}Where do you live? {147}{172}Around. {185}{225}l know where you live. ...Basitçe bizim yapacağımız 77'ye 62655 ekleyip, (ve bundan sonra gelen bütün numaraları da aynı şekilde öteleyip devam etmek.
(Tabi burada dikkatli FM okurları bunun problemin tamamını çözmeyeceğini, ikinci cdden üçüncü cdye geçiş sırasında sorun çıkacağını, ilk video cdsi bittiğinde altyazının bir kısmının eksik kalacağını, ikinci cd başlangıcında da bir ayarlama yapmak gerektiğini farkedecektir. Dahası tam doğru rakam 62655 değil bunun biraz daha fazlası (zira son altyazının ekrandan kaybolması ile bir sonraki cdnin başlangıcı arasında geçen muhtemelen bir miktar süre de olacaktır.
Fakat burda asıl önemli olan filmi güzelce seyretmek, ve bunu da işi fazla uzatmadan yapmak. Bu yüzden, her türlü durumu (iki cdlik altyazıyı tek cdye indirmek, tek cdlik altyazıyı iki cdye dağıtmak ve bunu n cd için yapmak) kapsayan daha iyi bir rutin programlamak için yarım saat daha uğraşmak yerine, rutini elle bir iki kopyala/yapıştırma yaparak tekrar çalıştırmayı tercih ettim.
Bilgisayar programlarında optimizasyon bir yere kadar, daha iyisi hayatta optimizasyon :)
#!/usr/bin/perl # # $delta=62655; #bir onceki cddeki altyazinin son zamani open (DOSYA,"thehustler2.txt")||die "Dosya okunamadı"; @sonraki= < DOSYA >; close (DOSYA); open (DOSYA2,">>thehustler1.txt")||die "Dosyaya yazamadım "; foreach $satir (@sonraki){ chop $satir; ($basla,$bitir,$yazi)=($satir=~ /{(.*)}{(.*)}(.*)/); print DOSYA2"{".($basla+$delta)."}{".($bitir+$delta)."}$yazi"; } close (DOSYA2);
syntax highlighted by Code2HTML, v. 0.9.1
Şimdi programın neler yaptığına bakallım:
1-Öncelikle, ilk satır, her perl programında olan shebang, yani bu programı çalıştırmak için gereken yorumlayıcıyı işaret eden satır
4-Ardından delta değişkenini tanımladığımız satır geliyor. Delta değişkeni bizim iknci cddeki altyazıyı ne kadar öteleyeceğimiz bilgisini bize verecek, kısaca ilk cdnin sonundaki altyazının ekrandan çıktığı an referansımız.
5-Bu satırda, klasik olarak bir dosyayı okumak üzere açıyoruz ve eğer dosya açılamazsa hata mesajı veriyoruz.
6-Bu satıra thehustler2.sub dosyasının içeriğini @sonraki dizisine depoluyoruz ve ardından dosyayı kapatıyoruz.
8-Bu satırda ise thehustler1.sub dosyasının arkasına yeni dosyayı ekleyip devam etmek için thehustler1.txt dosyasını eklenebilir olarak açıyoruz.
10-Bu satırdan itibaren ana döngümüz başlıyor. Yapılacak iş basit, her satırdaki süslü parantezler içindeki sayıları alıp bunları sanki yeni bir cdnin altyazısı değillermiş gibi ötelemek. İlk satırda $satir değişkenine bir döngüden bir satır alıyoruz.
11-Satır sonunu sil
12-Asıl işi yapan satırımız, aslında bir miktar kendini açıklamakla birlikte, perl bilmeyenlerin perl okumasının zor olduğu (kimse fransızcanın, fransızca bilmeyenler tarafından okunmasının zor olduğundan şikayet etmez ama) tezinin temel dayanaklarından biridir.
Basitçe bu satırın yaptığı, sırasıyla iki süslü parantez içindeki sayıları alıp bunları sonra işlemek üzere $başla ve $bitir değişkenlerine atamak, son olarak da satırın geri kalanını $yazi değişkenine atamak.
Bunu yaparken de kullanılan yöntem süslü parantezler içinde (.*) aramak. Perl'de bunun karşılığı herhangibir karakter ve başka karakterler. Yani aslında bu düzenli ifade bütün karakter dizilerini kapsar, fakat düzenli ifadeler, nasıl derler, açgözlüdür :) Yani buldukları her özel karakteri kaparlar, burda da başa ve sona koyduğumuz süslü parantezler { } arasındaki bütün karakterler anlamına gelmektedir.
13-Bu satırda da yukarda bahsedilen öteleme işlemi yapılıp süslü parantezler içine yazılmakta ve ikinci dosyaya eklenmekte.
14-Döngü sona erdiriliyor.
16-İkinci dosyayı da kapatıp programdan çıkmak.
Betiğin şu haliyle yaptığı iş aslında iki cd için hazırlanmış bir altyazıyı, tek cdye uygun hale getirmek. Fakat temel mantık aynı olduğundan bu yöntemi kullanarak (tabi arada bir editörle bir miktar satır silip) önce ilk iki cdyi birleştirip bölmek, ardından bölünmüş kısımla üçüncü cdyi birleştirip, üç cdlik altyazıyı iki cdye uygun hale getirmek mümkün.
Daha önce de bahsettiğim gibi ahım şahım bir program değil, büyük ihtimalle Randal Schwartz pir'imiz bütün bu programı tek satırda halleder (sakın gülmeyin, hakkaten bunu yapabilir, tarihte örnekleri vardır) ya da Can Uğur Ayfer hocamız bir optimizasyona gidebilir.
Bütün bu meselede önemle vurgulamak istediğim ne Perl'de kolayca işinizi görebileceğiniz, ne de geek tarzı durumdan kendine vazife çıkartmanın bir hayat tarzı olduğu. Mesele, hemen her durumda insanın başının çaresine bakabilecek araçlara sahip olması ve illa da birilerinden bir çözüm gelsin diye beklemek durumunda olmamasının verdiği keyif.
Çook eskiden, ticaretin başlaması, insanların kendileri için sağladıkları ürünlerin (tahıl, giysi, silah kapkacak vs.) ihtiyaç fazlası olanlarını satmaları şeklinde olmuş. Fakat zamanla, teknolojinin ve üretim şekillerinin gelişmesiyle insanlar artık, değil kendi ihtiyaçları için, ülkelerinin bile ihtiyaç duymadığı ürünleri, başkalarının ve başka ülkelerin ihtiyaçlarını karşılamak için yapmaya başladılar.
Sonuç olarak günümüzde çok azımız, kendimiz için üretim yapıyor, yaptığımız şeyleri gündelik hayatımızda kullanıyoruz. Bunun yerine hemen hepimiz para için üretiyoruz ve o parayı kendimiz için kullanıyoruz. Belki de bu yüzden, emekli olan hemen herkes el işlerine, marangozluğa, bahçe düzenlemeye, balıkçılığa hatta vitraya merak salıyor. Çünkü yaşanan bu DOLAYLI hayattan illallah denilmiş durumda, daha basit, daha direkt yaşamanın bir yolu bu.
İşte ben bu kadar basit bir şeyden dolayı, Perl'de programlamayı, GNU/Linux kullanmayı seviyorum. Çünkü bir problem çıktığında, bir marangozun masanın ayağı eğrildiğinde düzelttiği gibi oturup, uğraşıp düzeltme imkanım var. Adam/gün ücretimin orda harcadığım emeğe fırsat maliyeti olarak eşit olmadığını söyleyenler çıkanlar illa ki olacaktır, ama ben o sırada gülümseyerek muhtemelen bunun gibi makaleler yazıyor olacağım.
In Perl we hack One !
KIVILCIM Hindistan
Sundance