Perl // Küçük Regexp El Kitabı

0
Ansugo
Çok fazla kod yazıyor, ama bazı yerlerde tıkandığınızı hissediyorsunuz; == ile karşılaştırma yapabiliyor, ama string içinde arama yapmakta istiyorsunuz; ve en güzeli herhangi bir stringin altindan cikip cikmak istiyorsunuz, o zaman buyurun düzenli ifade cumhuriyetine.
Düzenli ifadeler, PERL'e, PHP'ye yada başka bir dile ait değildir. Zamane dillerinin hepsinde bu özelliği kullanabilirsiniz. Hatta Windows'ta olmasa da, *nix çeşidi bir OS'de komut satırında dahi kullanabilirsiniz. Nasıl mı? En basitinden şöyle:

ls -a | grep ^x

Bunu Linux'ta komut satırında yazdığınızda bulunduğunuz dizindeki x ile başlayan dosyaların listelendiğini göreceksiniz. Düşünün ki bir dizin var ve içinde birkaç yüz bin tane dosya var. Aradığınızı böyle daha kolay bulamaz mısınız?

Burada kısaca değinelim: grep bir regex komutudur. Dosyaların içindeki ya da standart inputtaki (STDIN) verileri alır ve desene göre eşleme yapar. ^x kısmı ise bizim desenimizdir. Deseni bir şablon olarak düşünmek son derece sağlıklıdır. Burada demişiz ki "x ile başlayan satırları listele". Yani başa bir ^ attık ve bu bu başında x olan satırlar anlamına dönüştü. Ne kadar hoş değil mi?

Ben bu "^",".","[..]" gibi işaretler eğer ki regex içinde kullanılıyorsa, bunlara anahtar diyorum. Siz isterseniz, desen atomu gibi ileri seviye isimlerde takabilirsiniz.

İşte, Regex cumhuriyetinde birkaç tane anahtar vardır. Bu anahtarların hepsini tek tek yazıyorum.

NOKTA (.)

Nokta, regex desenleri içinde yazıldığı zaman, yeni satır başı hariç herhangi bir karekter demektir. Peki yeni satır başı ne demektir?

Şimdi düşünelim. Bir text dosyası yazıyoruz (Wordde değil, Notepadde). Arada bir sürü enter tuşuna basıyoruz ve satır atlıyoruz. Bu bilgiyi kelime işlemci programmımız nasıl saklıyor? Yani nereden biliyor orada satır sonu olduğunu?

Tabii ki o yerlere bir işaret koyarak hallediyor. Bu işaret windows sistemlerinde " ", Linux sistemlerde sadece " " dir. Yani siz bir satır sonu gördüğünüzde, bilinki orada ya ya da bir tane var.

Windows'un i ek olarak koyması, windowsun daktilo olmasından kaynaklanıyor. 'in türkçesi "Carriage Return"dür. 'in Türkçesi ise, "Newline"dir. Şimdi elimize bir daktilo alalım. Satır sonuna kadar gidelim. Sonra soldaki kol ile sola kadar kafasını götürelim. İşte bu Carriage return, yani "Taşıyıcı geridön" işlemdir. Ama daktilolar otomatiktir: Siz o kolu sağa doğru itmek için bir kuvvet verdiğinizde, otomatik olarak o satırı bir satır yukarı kaldırırlar. İşte bu da "Yeni Satır" demektir.

Nokta işareti ise, regex içinde, satır sonu işaretleri hariç herşeyi bulur. Örneğin desen olarak ".*" yazdığınızda bunun anlamı "Yeni satır sonu hariç herhangi bir karekterden bolacana" demektir.

KÖŞELİ KÜMELER [..]

Köşeli kümeleri karekter guruplamak için kullanacağız. Örneğin bir regex yazıyoruz ve bir yerinde 0'dan 7'ye kadar olan rakamlara ihtiyacimiz olacak. O zaman "[0-7]" diye yazmamız işimizi rahatlatmak açısından çok önemli. Bu şekilde yazdığımızda, 0 ve 7 dahil olmak üzere aradaki tüm rakamlar desene dahil olacaktır.

Peki bunun tersi yok mu? Mesela diyebiliriz ki, 0-7 arasındaki rakamlar olmasın! O zaman tek yapmamız gereken başa bir ^ işareti koymaktan iabrettir. Yani [^0-7] gibi yazdığımızda 0 ve 7 dahil aradaki rakamların olmadığı kümeyi bul demiş oluyoruz. Bu ^ işaretini yukarıda belirttiğimiz "en başta ise.." anlamındaki işaret ile karıştırmayınız. Köşeli küme içine yazdığınızda gördüğünüz gibi olayın boyutu birden değişiyor.!

HERHANGİ BİR RAKAM ve OLMAYANI

Ama bu regex cumhuriyeti diyoruz. Mesela [0-9] yazmak akıllıca değildir, sadece seçimliktir. Çünkü regex'in "d" anahtarı vardır. Bu anaktar [0-9] demekle tamamen aynı şeydir. Yani "Herhangi bir rakam olan" anlamı verir. d harfini "decimal" olarak düşünün. Decimal yani 10 luk taban da 10 tane rakam vardır ve bunlarda 0 dan 9 a kadardır.

Ama ya bunun tersi? Yani [^0-9] u nasıl yazacağız? Eh, o da kolay! Sadece d anahtarının d harfini büyük yazacağız. D yazdığımızda regex motoru "Harhangi bir rakam olmayan" demek istediğimizi anında anlayacaktır.

HERHANGİ BİR BEYAZ BOŞLUK ve OLMAYANI

Gelgelelim yukarıda bahsettiğimiz newline ve carrige return'un biraz daha gelişmiş aramasına...

Nasıl ki bunlar bizim çıplak gözle görmediğimiz işaretlerini olduğu yere bırakıyorsa, en basitinden "Tab" tuşuna bastığımızda da, o da olduğu yere bir işareti bırakır. Bir de formfeed karekteri vardır ve f ile gösterilir, ama ben bu işareti daha görmedim. Space Bar yani başluk işaretelerinin ise amblemini hatırlamıyorum desem yeridir.

İşte boşluk, satır sonu, yeni satır, tab gibi karekterler Türkçe'ye beyaz boşluk olarak çevrilmişlerdir. Bundan sonra bir yerde "White Space" ya da "Beyaz Boşluk" terimlerinin kullanıldığını görür iseniz, bilin ki orada bizim bu işareti ile başlayan kelimelerimiz ya da bunların ASCII sürümünden bahsediliyor.

İşte, s işareti herhangi bir beyaz boşluk karekteri demektir. Yani desenlerimizde ne zaman ki s işaretini kullanırız, o zaman regex motoru tab, yeni satır gibi karekterleri eşler.

Peki ya bunun olmayanı? Tek yapmamız yukarıdaki gibi harfi büyütmektir. Yani S yazmamız, bu karekterlerden olmayan küme demektir.

HERHANGİ BİR ALFASAYISAL ve OLMAYANI

Alfasayısal ne demektir? Eğer şimdiye kadar bunu düşünmedi ve araştırmadı iseniz, bunu size anlatmayacağım. Düşündü ve araştırdı iseniz, zaten anlatmaya gerek yoktur. Ama size bir tüyo vereyim.

"Programlama dillerinde değişken isimlerinde hangi karekterler kullanılır?" bir düşünelim. Duyamıyorum? Rakamlar, harfler ve underscore (_) işareti mi dediniz? Evet sadece onlar kullanılır. Çünkü bunlar alfasayısal karekterlerdir. Araştırın ve bunların ne demek olduğunu iyice öğrenin.

Regex'te ise w işareti, "Herhangi bir alfasayısal karekter" demektir. Yani [a-zA-Z0-9] kumesi ve ek olarak "_" isaretidir.

Bunun tersi ise, buyuk harflisidir. Yani W isaretidir. W yazdigimiz her yer, "Herhangi bir Alfsayısal olmayan karekter" demektir.

STRING BAŞI VE SONU

Hangi dilde olursa olsun, stringler ya da diziler ya da degiskenler ya da sabitler, bellekte belli bir adresten itibaren tutulurlar ve belli bir adreste ise sonlanırlar. Bu son'u belirtmek için ise başka ozel bir karekter vardır.

Ancak bunları anlatmak için, oturupta bellek adreslemeden, C'den ya da Assembly'den bahsetmeyeğiz. Çünkü konumuz regex, regexte kalsın o zaman.

Bir stringin başında aramak istediğimiz şeyleri yukarıdaki meşhur anahtarımız olan ^ ile yapıyoruz. Peki string sonu? Onu da "$" anahtarı ile yapıyoruz. "^Ali$" gibi bir desen yazdığımızda bu demektir ki "Ali ile başlayan ve hemen orada son bulan birşeyler var mı orada?"

VEYA LI ARAMA

Peki.. Deseni yazıyoruz ama bir yerde tıkandık. Çünkü "bundan" ya da "şundan" gibi bir ifade yazmak istiyoruz. Yani ya o olacak, ya da bu olacak. O zaman hemen programcılık bilgilerimizi hatırlayalım. Programlama dillerinde "veya" yı anlatmak için "||" işaretini kullanıyoruz. Regex cumhuriyetinde ise tek çizgi kullanmamız yetecektir. Yani bir parantez açacağız, iki değeri | işareti ile ayırıp parantezi kapatacağız. (ali|veli) dediğimiz anda, regex motoru "ali ya da veli varsa" diye düşünmeye başlayacaktır.

ÇOKCA, EN AZ BİR TANE ve GERİSİ

Ama aramalarda, bir şeyin iki kez tekrar etmesi, ya da en az bir kere tekrar etmesi işimize yarayabilir. Belki de çokcana tekrar istiyoruz. O zaman biraz daha okuyalım.

Şu üç işareti aklımızda tutalım: ?,* ve +. Desen yazarken bir ifadenin sonuna ? yani soru işareti koyduğumuzda bu, "0 veya 1 tane" demektir. Yani 0 kabulumuzdur ancak 1 den yukarısını istemiyoruz demektir.

* işareti ise "0 veya çokcana" demektir. * 0 dan başlar, ama üst sınırını biz sınırlamadıktan sonra anlamaz. ^* gibi bir ifade ne işimize yarayabilir ki?

+ işareti ise, "1 veya çokcana" demektir. Bunun * dan farkı, indisin başını 0 değil 1'den almasıdır. Yani bunu kullanacağımız yer "En az bir tane" bulmamız gereken yerlerdir.

Ama siz rahat programcısınızdır, her şeye karışmak ve sonradan sorun yaşamak istemezsiniz. Bir de ileride belki "En az 2 tane en fazla 8 tane" gibi desenler yazmak zorunda kalabilirsiniz. O zaman süslü parantezler { }'i kullanacaksınız demektir. Süslü parantezler iki parametre alırlar. Ama tek parametre de alabilirler. Kısaca birkaç örnek yazalım.

x{1,} En az bir tane, üst limit yok
x{,8} En fazla 8 tane, 4-5-6 tane de olabilir.
x{8} Tam olarak 8 tane.
x{4,7} En az 4, en fazla 7 tane..


İşte gördüğünüz gibi süslü parantezler çok daha yararlıdır. Ben kod yazarken + ve ? anahtarlarını hiç kullanmıyorum. Onun yerine süslü parantez açıp, keyfime göre yazıyorum.

BİRAZ DESEN YAZALIM MI?

Evet yazalım. Yazalımda görelim şu desenlerin gücünü.

İlk uygulamamız, geçenlerde bir e-posta gurubunda birine özel olarak yazdığım bir desen. Sağolsun, bir teşekkür dahi alamamıştık, ama şimdi işe yarayacak işte...

Soruyu soran kişinin derdi herhangi bir yerden "27/07/2002 gibi bir şekilde girilen verinin, doğruluğunu nasıl kontrol edebilirim?" idi.

Desen yazmadan önce ilk olarak bir süre düşünmeliyiz, gerekli alet ve edavatı yanımıza almalıyız. Şimdi yukarıdaki tarih formatını atomlarıonı ayırarak düz yazı olarak yazalım:

* Bir ayda en fazla 31 gün olabilir. Günler 01-09 arası, ya da 10-29 arası, ya da 30 ile 31 olabilir. (Bunların hepsi farkli bir desendir)
* Bir yılda en fazla 12 ay olabilir. Aylar 01-09 arasý ve 10,11 ile 12 dir.
* Yıllar 4 lük formatta ise ve biz 2000 li yılların doğru olduğunu düşünüyor isek, o zaman 2 ile başlayabilir ve sonuna 3 tane herhangi bir rakam gelebilir.


Şimdi ise yazmaya başlayalım :

^(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})/


Bu desenimizin ilk parçasıdır, yani günlerle ilgili bölümü. Sadece sonuna / işareti konmuş ve anlaşılır biçimde parantezlere ayrılmıştır. (Parantezlere ayırma işini muhakkak yapmalısınız. Ek olarak paranteze ayrılmış verinin PERL'de ve PHP'de, eğer işlem geçerli ise, $1.. gibi değişkenlere sıra ile yazılacağını da unutmadan!)

Biraz açalım. En başa ^ işaretini koyduk. Bunu stringin en başından itibaren aramaya başladığımızı belirtmek için kullandık. Sonra 0[1-9]{1} gibi bir sene kullanıyoruz. Yani "Bir tane 0, sonra 1-9 kümesinden tam olarak 1 tane" demiş oluyoruz. Bunu sadece 01-09 kısmını bulmak için yazdık. Ama bunun "veya"sı da vardı değil mi? Araya bir | işareti koyduk ve [1-2]{1}[0-9]{1} diye devam ettik. Yani dedik ki "1 veya 2 rakamından tam olarak 1 tane ve hemen sonra 0-9 arası rakamlardan tam olarak bir tane"... Bu bize 10 ile 29 arası rakamları bulmak için lazımdı. Ama bunuın da veyası vardı değil mi? Hani 30 ile 31 de olabilirdi? Onun içinde 3[0-1]{1} yazdık. Yani "3 rakamı, sonra 0,1 kümesinden bir rakamdan tam olarak bir tane" demiş olduk. Sonra parantezimizi kapattık ve / işaretini koyduk. İlk kısım bitti, sıra aylar kısmına geldi:

(0[1-9]{1}|1[0-2]{1})/


Aylar kaç şekilde olabilirdi? 01-09 arası ve 10,11 ile 12.. 0[1-9]{1} yazdık. Yani dedikki, "0 rakamı ve sonra 1-9 kümesinden herhangi bir rakamden tam olarak bir tane!". Ama bunun da yadası vardı. Bunun yadası 10,11 ve 12 idi. Onun içinde 1[0-2]{1} yazdık. Gelgelelim son bölüm olan, yıl bölümüne :

(2[0-9]{3})$


Burada da demişiz ki "2 ile başlayan, 0-9 arası harfler kümesinden tam olarak üç tane". Ve sonra bu parantezimi de kapatıp, $ ile sonlandırdık.

Şimdi bu desenin tam kodlarınının "PERL"cesini veriyorum. Bir programci, en gicik dillerdeki kodlara bile baktigi zaman isine yarayacak kadar ne oldugunu cikarmak zorundadir. Aşağıdaki kodlardan da ne yaptığımızı çıkaracağınıza eminim!

#!/usr/bin/perl -w
use strict;
# Gün / Ay / Yıl
$_ = "27/07/2002";
if(m~^(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})/(0[1-9]{1}|1[0-2]{1})/(2[0-9]{3})$~) {
# Regexler parantez ile guruplanmistir. Uc tane parantez vardir.
#Bu demektir ki, $1..n arasi degiskenlere otomatik olarak
#yazilacak donen degerler, 3 tanedir : $1,$2,$3
#printf ("%s ",$_);
# Gün
#printf ("%s ",$1);
# Ay
printf ("%s ",$2);
# Yıl
#printf ("%s ",$3);
# Yukarida Ay bolumun onundeki diyez kaldirip o deger yazdirilmistir.
# Istenen deger onundeki kaldirilip o deger alinabilir.
}else {
print("Uygun değil ");
}
__END__;


Şimdi açıkca söyleyin, bu kodlarda ne yaptığımızı anlamadınız mı? Anlasanızda biraz ayrıntıya girelim.

PERL ve PHP birbirinin aynı ekolden gelmişlerdir. PHP PERL modülü iken, CGI scripting kolay yapılsın diye bağımsızlığını ilan etmiştir. Ama temelde ikisi de bir çalıştırabilir dosya tarafından yorumlanır ve icra edilir. Derlenmiş bir program gibi bağımsız değildir (-ki her ne kadar yorumlayıcıyı kendi içine gömerek çalıştırabilir programlar üretmenizi sağlayan ekstra programlar var ise de) İşte deminden beri, yazdığımız desenimiz şudur :

^(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1})/(0[1-9]{1}|1[0-2]{1})/(2[0-9]{3})$


Bu deseni m~ ~ arasına yazdık. PERL'de m/// operatörü, match yani eşleme operatörüdür. Bunu PHP'de PERL uyumlu olan (ne kadar uyumlu ise) preg_match() ile, ya da PHP'nin kendi kafasından uydurduğu, ereg() ya da eregi() ile kullanabilirsiniz. (Bakınız. PHP'de ereg() ve eregi() diye iki fonksiyon olması, tamamen aptallıktan ibarettir. ereg() yazdığınız deseni, büyük küçük harf gözeterek inceler. Yani "Ali" ile "ali" aynı şey değildir. ama eregi() fonksiyonu ereg() fonksiyonun "ignore" edilmiş halidir. Bu fonksiyon büyük küçük harf farkını ignore eder. Yani "Ali" ile "aLi" ayni şeydir. PERL'de bunun için i parametresi yeterlidir. Ama bunu biraz ileride göreceğiz zaten)

Bu minicik scriptimizi komut satirinde çalıştırın. Ya da bunu PHP ye uygulayip çalıştırın. Göreceksiniz ki bu desen, aşağıdaki tarih formatlarını eşlemez ve uygun olmadığını yazar :

00/01/2002 32/01/2002 001/01/2002 320/01/2002 29/00/2002 29/13/2002 29/001/2002 29/120/2002 29/12/1002 29/12/1999 29/12/01999


Evet.. Regex Cumhuriyetine yeniden hoş geldiniz :-)

GELİŞTİRİLEBİLİR EMAİL EŞLEME

Emaillerin hangi formatta olduğunu ne kadar biliyoruz? Ama en normal internet kullanıcısı bile, emaillerin "ONEK, @ ISARETI, SON EK, BIR NOKTA ve SONEK" olarak yazildigini bilir. Ama herşeyi düşünmemiz de gerekir. Sadece @ işaretine bir tane noktaya bakmak hatadır. Aradaki uzunluklara, içeride boşluk karekterlerinin olup olmadığına bakmak gereklidir. preg_match("/@/",$email); demek ile bir email adresinin dogru oldugunu ogrenemezsiniz. Sadece içinde @ olabilecek herhangi bir texti ya da yazıyı kontrol etmiş olursunuz.

^([a-zA-Z0-9_-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([a-zA-Z0-9-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$


İşte yukarıdaki desen bir email eşleme desenidir. Bunu ben yazmadım, ama gördüğünüz gib yazan kişi övülecek bir kişidir. Çünkü son derece açık, kontrolcü bir desen yazmıştır.

Şimdi size desen yazarken kullanabileceğiniz müthiş bir metoddan bahsedeceğim. Buna atomlarına ayırma deniyor. Mesela yukarıdaki deseni atomlarına ayıralım ve anlaşılır hale getirelim :

^
([a-zA-Z0-9_-.]+)
@
(
([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)
|
(([a-zA-Z0-9-]+.)+))
([a-zA-Z]{2,4}|[0-9]{1,3})
(]?
)
$


Bu şekilde tablarla içiçe yazdığınızda desenleriniz daha bir anlamlı hale gelecektir. Isterseniz önce süslü parantezler ile bloklayarak yazabilirsiniz. Uzun desen eşlemelerde son derece işinize yarayacaktır. Ki benim burada ayırdığım çok az bir kısımdır. Daha fazla parçalayarak uzatabilirsiniz.

SONA DOĞRU

Sona doğru yaklaşırken ignore ve global anahtarlarından da bahsetmek istiyorum. i anahtari "ignore" demektir. Bir desen de ki büyük küçük harf ayrımını gözetme demektir. g parametresi ise "global" demektir. Yani sonuna kadar aramani yap demektir. PHP de PERL uyumlu fonksiyonlardan preg_match() fonksiyonunda preg_match("/desen/i",$string); diyerek ignore işini halledebilir, ya da neden olduğunu anlamadığım, preg_math_all() ile global arama tarama yapabilirsiniz. Ya da PHP'nin kendi fonksiyonları olan ereg() ve eregi() yi kullanabilirsiniz.

Ancak regex bu kadar kısa bir konu değildir. O'Reilly Associates bu konu için bir yazarına yüzlerce sayfa kitap yazdırıp yayınlıyor ve satabiliyor ise, colon eni 80 karekter olan 410 satır civarı bir yazıya bunları sığdırmak zordur. Ama kısaca durum bundan ibarettir. Bu kadar bilgi ile artık istediğiniz çoğu şeyi yapabilirsiniz. Ama regex yaparken şu ünlü sözü unutmamalısınız : "Küçük hatalar büyük sorunlar doğurur. Büyük hatalar ise kimi zaman sorun doğurmaz!" Yani yazdığınız regex kodlarında her olasılığı her zaman düşünemiyor olabilirsiniz. O sebeple iyice test etmeden, asla başkasının desenlerini ya da kendi yazdığınız desenleri sitelerinide kullanmayın.

Çünkü desenlerin en önemli yanlarından birisi güvenliktir. Site günveliğinin sağlamakta iki unsur çok önemlidir. Birisi sitenizin barınağının adminlerinin ne kadar akıllı olduklarıdır. Yani sürekli securityfocus gibi bugları ve fixlerini öğrenebileceği siteleri her sabah geziyor mu? Birkac on tane güvenlik mail listine üyemi? Bugları fix etmeye üşeniyor mu? gibi...

Ancak diğer önemli tarafta size düşmektedir. Yani kodlarınız ne kadar sağlıklı? PHP diyorsunuz, PERL diyorsunuz, C diyorsunuz ve CGI scripting yapıyorsunuz. Dinamik sayfalar üretiyorsunuz. Ama bu dinamiklik illaki bir yerlerde kullanıcıdan birşeyler istemeniz, almanız demektir. Peki bu bilgileri alırken gerekli kontrolleri yapıyor musunuz? Bir kişi sizin yaptığınız mail formundan size mail yollarken, acaba serverınızda birkaç tane zararsız(!) kod mu icra ediyor? Bunlar ayıklıyor musunuz?

Zamanında bir sitenin tasarım işini üstleniyordum. Daha önce yer aldıkları hosting şirketine telefon açıp "Kardeşim ne biçim linux server bu? PERL'ün olmadığı sistem mi var?" dediğimde, karşımdaki bey bana "Kodlarınızı önce biz incelemeliyiz. Siz de bilirsiniz ki, saçma sapan bir kod ile router'a kadar ulaşılabilinir" dediğinde, bir yandan hak verip, bir yandan da çok sinirlenmiştim. Çünkü doğru söylese de, müşterisine potansiyel bug sahibi olarak bakmak pek de hoş bir iş değildi. Ama demek ki bir kere ağızları yanmış çaydan, limonatayı üfleyerek içiyorlardı.

Görüşler

0
yalcink01
Eline sağlık, pek güzel yazmışsın. Bu aralar düzenli ifadeler üzerine Türkçe kaynak artışı yaşamaktayız :) İnsanın ilgilendiği konularda yazılar görmesi pek bir hoş oluyor. Umarım, şöyle irice bir regexp kitabı yazacak birileri de çıkar. Darısı python'un başına.
0
FZ
Mastering Regular Expressions, Second Edition kitabı tercüme edilse konu hallolur diye düşünüyorum. Bu işin kutsal kitabıdır ;-)

http://www.amazon.com/exec/obidos/ASIN/0596002890/qid=1071068773/sr=2-1/ref=sr_2_1/103-7677329-8047033

Bu arada Reg Exp´in en geniş kümesi Perl ortamında kullanıldığı için eğer hakkı ile öğrenirseniz bu bilgi Python´dan tutun JavaScript´e kadar pek çok dilde işinize yarar.
0
yalcink01
Ben bu amazon.com'u bir türlü sevemedim gitti. Eminim o da beni sevmiyordur ya neyse. Kitap 496 sayfa, biraz fazla kalın gibi duruyor :) Bilgisayara indirmem mümkün mü ? En azından bir incelerdim.

Aslında tercüme işi ile ilgilenmek lazım ama şu aralar man sayfalarına kafayı takmış durumdayım. Bir de benim çevirdiğim Linux Sistem Yöneticisinin Kılavuzunun yeni sürümü yayınlandı. Onu da güncellemek lazım. Bu kitap tercüme edilse lafını üzerime alınmakla birlikte/* sadece şikayet eden değil, sorunlara küçükte olsa çözüm katan bir insan olmayı daima sevmişimdir*/ bu aralar aşırı miktarda doluyum.

Ayrıca bir deneyimimi paylaşmak isterim/*regex.info yu çevirdim ya, ukalalık yapmadan duramam :)*/ : bu regexp ile ilgili çevirileri, bu konuya az buçuk hakim arkadaşların aynı terminoloji üzerine anlaşıp çevirmesi gerekir diye düşünüyorum. Benim gibi hiçbir şey bilmeden bu çeviri işine dalırsanız, ananızdan emdiğiniz süt burnunuzdan gelebilir. Tecrübe ile sabittir. Tabi bütün bunlar çevirmeye niyetli birileri olabilir fikrine dayanıyor.
0
sametc
jamie Zawinski derki :

Bazı insanlar bir problemle karşılaştıklarında şöyle düşünür:'Biliyorum şimdi duzenli ifadeleri kullanmam gerekiyor'. Evet şimdi onların iki tane problemi var" :)
mustafa başer-python kitabından alıntı
0
FZ
Reg Ex ile ilgili öğrenilmesi gereken birinci önemli şey bunların nerede nasıl kullanılacağı, sözdiziminin detayları falan. Reg Ex ile ilgili öğrenilmesi gereken ikinci önemli şey bunların hangi durumlarda kullanılmayacağı :)
0
malkocoglu
Cok regex iceren kodlar icin bu sebeple "write-only" kod diye bir deyim vardir, 2. problem tanimina benziyor biraz. Regex'lerin gucu tartisilmaz tabii. Onlarsiz ne yapardik!
0
FZ
Lemma: Hiçbir Perl problemi yoktur ki çözümü yine Perl içinde ``cool´´ bir şekilde ortaya konmuş olmasın.

Karmaşık RegEx´leri anlamak isteyenlerin ilacı: Explain-Regex modülü:

http://search.cpan.org/~pinyan/YAPE-Regex-Explain-3.011/Explain.pm

Perl uygulamalarının %90´ı zaten yazılmıştır. ;-)
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Perl Öğreniyoruz - 2

cayfer

Geçen hafta çözdüğümüz örneği bir de Perl'in özelliklerinden yararlanarak çözelim.

Editörün notu: Perl öğreniyoruz yazı dizisinin ikincisini okuyorsunuz. Sabırsız olanlarınız için cayfer.bilkent.edu.tr incelenmesi gereken bir adres.

Yeni Deascifier

anonim

15 senedir İngilizce klavye ile yazıyorum, ve fena alıştım. F klavyeye de, Türkçeleştirilmiş Q klavyeye bile alışacak vaktim ve isteğim yok. Eh dedim ben de, biraz beyin ve Perl kaslarımı çalıştırayım, ve şu işe kalıcı bir çözüm bulayım. Benim değişmeye niyetim yok, teknoloji bana yardım etsin.

ePerl ile Kolay Internet Programlama

perlci

ePerl modülü ile Perl kodlarini tıpkı ASP ya da PHP gibi HTML dosyalarının içine gömebilirsiniz. Böylelikle daha kolay bir şekilde Perl kullanmış olursunuz. Bu modülü kullanabilmeniz için de tabii ki biraz Perl bilmeniz gerekir.
Daha fazla bilgiyi http://www.eperl.net adresinde bulabilirsiniz.

Editörün Notu: Rıza Çelik'e Perl'e katkılarından ötürü teşekkürler.

Perl 20. Doğum Günü ve Perl 5.10 Çıktı

anonim

Geçtiğimiz günlerde Perl'in 20. yaşgünü tüm dünyada coşku ile kutlandı. Doğum gününden 1 gün önce Perl Vakfı Perl 5.10'u duyurdu.

Perl 5.10 da görünen en önemli değişiklik smart match operator. Bir tür karşılaştırma yapmamıza yarayan operatör array içinde aradığımız scalar değeri bulmamızı sağlıyor. Yeni operatörümüz: "~~". Örnek vermek gerekirse $needle scalarimizi array @haystack içinde arıyorsak, kolayca yeni operatörümüzü kullanıyoruz.
if ($needle ~~ @haystack) ...

Sonuç olarak artık Perl'de tüm kaşılaştırmalar doğru şeyi yapmamızı sağlıyor.

Perl programcısı olmaktan gurur duyanlar için özel !

sundance

Perl'ün yaratıcısı Larry Wall, alışageldiğimiz tarzında yaptığı sunumla, 7. geleneksel Perl Soğanının Durumu isimli toplantıda yine herkesi kırdı, geçirdi :)

'Biz, isteksizler,
cahiller tarafından öncülük edilen bir yolda,
imkansızı gerçekleştirmeye çalışıyoruz.
O kadar uzun süredir o kadar çok şeyi, (elimizdeki) o kadar az şeyle gerçekleştirdik ki
Artık (elimizdeki) hiçbir şeyle, herhangibir şeyi yapabilecek hale yetkinliğe eriştik.'