Scripting İleri Seviye Ders: Scripting İleri Seviye Yazan: L4roXyL - Hasan AYDENİZ Tarih: 17 Ağustos 2012 Not: [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] dökümanıdır. Evet arkadaşlar bu makalemizde mIRC Scripting-de kod yazarken daha kısa, hızlı ve işlevsel kod yazma biçimleri hakkında örnekler vereceğim. Ders içeriği scripting-de bildiğiniz kullanımınların, farklı kullanımlar ile daha işlevsel hale gelmesi ve bir takım orta/ileri seviye kod yazarları için pratik ve değişik bilgiler içermektedir. mIRC Scripting her zaman dediğimiz gibi hayal gücüne bağlı, belirli yeterlilikler ile işgören veya gelişime yönelik kodlar yazma sanatıdır. Betik bir dil olduğundan, aynı işlevi getiren bir sonucu çeşitli farklılıklar ile yazabilme olanağını fazlasıyla tanımaktadır bize. Ders başı uyarısı: Ders içeriği yeni kodlamaya başlamış veya normal düzey kodlayıcı arkadaşlar için uygun değildir. Ders içeriğindeki bilgiler, zaten scripting konusunda belirli bir noktaya gelmiş(orta ve ileri düzey kod yazarları) kişilere yöneliktir. Fazla uzatmadan dersimize başlayalım. 1- Ölçüm Parantezleri Kod yazarken sık sık kullandığınız, daha doğrusu eski kodlara bakıldığında görülen "[" - "]" parantezleridir. Türkiye'de ki mIRC Scripting-de bu parantezler genellikle gereksiz biçimlerde kullanımaktadır(bu önizlemem forumlardaki birçok kodlar üzerindendir) Bu parantezler esasında daha çok öncelik tanıma işlevi kullanılır. Örnek: Kod: alias _x var %, $0 | while (%,) { echo -> $1 | dec %, } | return $~1 Kod: //echo $_x(d1) $_x(d2) $_x(d3) $_x(d4) Kod: -> d1 Şimdi ölçüm parantezlerini devreye sokalım, örneğin; Kod: //echo --> $_x(d1) $_x(d2) [ $_x(d3) ] [ [ $_x(d4) ] ] Kod: -> d3 Sıralamanın açıklamasını yapacak olursak, tek ölçüm/öne getirme kullandığımız d3 ilk sıraya alındı. Çift ölçüm kullandığımız d4 verisi 2. sıraya alınmıştır. Çift ölçüm kullanılan d4 verisini bu kullanımda her zaman 2. sırada olacaktır. Bunun sebebi kullanım esnasında ilk girilen ölçüm parantezi d3 verisine aittir. Yani kısacası siz ölcüm yapsanız dahi, internal bir sıralama olacaktır her daim. Ölçüm parantezleri örnek kullanımda değişik yerlere geldiği taktirde bir çok farklılıklar yapabilir. Örnek: Kod: //echo --> $_x(d1) [ [ $_x(d2) ] $_x(d3) ] $_x(d4) Kod: -> d2 Kod: //echo --> $_x(d1) [ $_x(d2) [ $_x(d3) [ $_x(d4) ] ] ] Kod: -> d4 Lakin bu parantezler farklı kullanımlarda değişik etkiler yapabilir. Örnek: Kod: //var %. = deneme,/(e)/g | echo $regex(%.) Kod: * Invalid parameters: $regex Çünkü $regex() kullanımı normalde $regex(text,re) şeklindedir. Şimdi burada "ama biz %. değişkenine atadık o kullanımı, neden görmüyor?" denilebilir. İşte bu durumda öncelik/gelişim parantezlerini kullanabiliriz. Aynı kullanımı şu şekilde yaptığımızda: Kod: //var %. = deneme,/(e)/g | echo -> $regex( [ %. ] ) Kod: -> 3 Devam edelim. Ölçüm parantezleri öncelik tanıma konusunda hemen hemen her yerde geçerlidir. Örnek: Kod: //echo -> $!ticks Kod: -> $ticks Kod: //echo -> [ [ $!ticks ] ] Kod: -> 19714235 Bu konu hakkında gelişmiş örnekler verelim. Örnek: Kod: //var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> %: Kod: -> $time $chr(45) $day $chr(45) $fullname Örnek: Kod: //var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> [ [ %: ] ] Kod: -> 19:39:28 - Sunday - xlis Ölçüm parantezleri yukarıda verilen örnekler ve daha değişik şekiller ile kullanılabilir. 2- Matchtext Kısmında Kullanılabilir Değişiklikler Matchtext kod yazan kişilere yabancı bir kelime gelmeyecektir. Bir takım event-lerde olayın gerçekleşmesinde bir nevi sorgu teşkil eden text-dir. Örnek: Kod: on *:text:*deneme*:#:işlev Yukarıdaki kullanım aşağıdaki kullanım ile aynı işlevi görür: Kod: on *:text:*:#:if (*deneme* iswm $1-) işlev Bazende ilk kelime şu olsun ve eğer 2. hatta 3. kelime varsa işlem yapalım gereksinimi duyulur. Örnek: Kod: on *:text:*:#:if ($1 = !deneme && $2) işlev Yani kısacası bu olay sorgu eşleşirse çalışır. (!deneme x - !deneme 1 - !deneme deneme gibi.) Bu tür kullanımlarda yani eğer 2. kelimede varsa gibi kullanımlarda, text-i genellikle matchtext kısmından çıkarıp direk bir /if sorgusu içerisine entegre ederiz. İşte tam burada normalde bitwise operatörlerinden olan "&" operatörünü kullanabiliriz. Bitwise operatörlerinden olan "&" prefix-i "ve" manasına gelir. Yani scripting-deki "&&" gibi. Yukarıdaki kodu bu operatörü kullanarak matchtext kısmına girebiliriz. Örnek: Kod: on *:text:!deneme &:#:işlev Yani kısacası external bir sorgu yerine, internal bir sorgu gerçekleşir. Bu kullanımda kodun daha hızlı çalışmasını ve gereksiz karakter fazlalığından kurtulmasını sağlar. Bir örnek daha verelim: Kod: on *:text:!deneme & &:#:işlev Yani aşağıdaki kullanımlar ile aynıdır. Kod: on *:text:*:#:if ($1 = !deneme && $2 && $3) işlev Buraya kadar matchtext kısmında kullanılan "&" prefixinin ne işe yaradığını gördük. Devam edelim. Matchtext kısmında regular expression kullanabileceğimizi daha önce söylemiştim. Bunun için gereken olay başına "$" prefixini eklemekdi. Örnek: Kod: on $*:text:/^(merhaba|slm)$/iS:#:echo -> $regml(1) Bilindiği üzere matchtext kısmında %değişken de kullanabilirsiniz. Örnek: Kod: /set %d *deneme* Buraya kadar anlaşılmayan birşey yok sanırım. Şimdi esas konuya gelecek olursak, $eval/$() sayesinde matchtext kısmında belirlediğimiz bir alias-ıda kullanabiliriz. Örnek: Kod: alias _d return /^(s(e|)l(a|)m|m(e|)rh(a|)b(a|))$/iS Daha gelişmiş bir örnek verelim. Bu örnek alias veya %değişken-lerinizi matchtext ve kanal kısmında da kullanabileceğinize örnektir. Kod: alias _ct { 3- Döngü İçerisinde Döngü(ler) Kullanma Bildiğiniz üzere /while komutu scripting-de döngüler kullanmak için kullanılır. Bu döngüler içerisinde sorgular dahil olmak üzere birçok şey kullanabilir, hatta bazen döngü içerisinde döngü ve isterseniz döngü(döngü(döngü(vs.)))) şeklindede kullanabilirsiniz. Örnek bir while döngüsü: Kod: //var %& = 5 | while (%&) { echo -> %& | dec %& } Kod: -> 5 Peki /while içerisinde /while kullanılabilirmi? Evet kullanılabilir. Ciddi bir örnek verelim: Kod: alias _wh { Kod: -> First Loop: 3 Buradaki mevzu bahis nedir? Scripting içerisinde aynı anda 2 döngü kullanamıyoruz. Yukarıdaki örnekde gördüğünüz üzere özetlemek gerekirse: Kod: -> Start First Loop Döngüler hakkında bir kaç bilgi daha verelim.
Kod: alias _th { Kod: -> 10 Not: $* ayrıştırıcı tanımı while içerisinde farklı bir komut içerisinde bağımsız kullanılabilir. Lâkin bu kullanımda dahi önceki döngü pause konumuna geçer. $* işlemi bittikten sonra devam eder. Kullanıma göre bu işlevler değişkenlik gösterebilir. Örneğin $* tanımını ilişiksiz ve döngüye ait komut veya komutların işlev satırından önce kullanırsak, ilk önce $* tanımının işlevi gerçekleşir. Ardından döngüye atanan diğer komutlar gerçekleşir. Örnek: Kod: alias _th { Kod: -> 5 Örnek: Kod: alias _th { Kod: -> 10 d Sonuç olarak yukarıdada değidiğim gibi kullanım şekillerine göre değişiklikler gösterebilir. 4- Tokenize İle İnternal Döngü Bildiğiniz üzere /tokenize komutunu scripting-de ayrıştırma için kullanılır. Genellikle socket-larda kullanılan /tokenize esasında daha değişik işlemler içinde kullanılabilir. Örnek bir tokenize işlemi: Kod: //tokenize 32 ex1 ex2 ex3 ex4 | echo -> $1- Kod: -> ex1 ex2 ex3 ex4 Örnek: Kod: //tokenize 32 ex1 ex2 ex3 ex4 | echo -> $2-3 Kod: -> ex2 ex3 Şimdi /tokenize ile nasıl sorgulamalar yaparız, bu konuya değinelim. Scripting-da bazen basit sorgulamak için /while vb. döngüler kullanılırız. İlk öncelikle /tokenize ile ilişikli kullanılan $* tanımını kullanalım. $* tanımı ayrıştırılan kelimeleri ayrışma sayısınca satır satır verir. Bunu en basitinden /echo kullanarak görebilirsiniz. Örnek: Kod: //tokenize 32 ex1 ex2 ex3 ex4 | echo -> $* Kod: -> ex1 Peki $* kullanarak sorgulama veya değişik işlemler nasıl yaparız. Örneğin yukarıdaki ex* kelimelerini sıralarken hepsini büyük yazdıralım. İşlem: Kod: //tokenize 32 ex1 ex2 ex3 ex4 | scid 0 echo -> $!upper( $* ) Kod: -> EX1 $* ile sorgulama örnekler Örneğin herhangi bir kanal penceresindeki seçili nicklerden($snicks) belirlediğimiz harf ile başyana nickleri listelemek isteyelim. Bunun için /while yada çok iyi kombine edilmiş bir regex kullanmamız gerekebilir. While ile örnek: Kod: alias _nl { Şimdi aynı işlevi $* ile yapalım. Örnek: Kod: alias _nl2 { Gördüğünüz gibi external bir döngü olmadan aynı işlemi /tokenize ile birlikte kullanılan $* sayesinde yapabildik. Şimdi $* tanımında farklı bir kullanım göstereceğim. Komut satırı: Kod: //tokenize 32 deneme deneme1 deneme2 | echo -> $left($*,3) Kod: -> `~$ Bunun sebebi mIRC çoğu internal fier-ları bu şekilde tanımlar. Tokenize ve $* hakkında söyleyeceklerim bu kadar. 5- $remtok Tanımının Önemi Remtok kullanımı bilindiği üzere belirtilen string içerisindeki belirtilen konumda olan ve yine belirtilen biçimi silmeye yarar. Lâkin $remtok tanımın en önemli kısmı silinmesi istenilen text ne ise kesinlikle sadece onu siler. Yani benzer text-leri koruma altına alır. Scripting-de en çok kullanılan genelde text-ler içerisinde kelime/harf silme ayıklama işlemidir. Bunun için bir çok şey kullanılabilir. Örnek: $regsubex, $remove, $removecs, $replace/x vb. Ama bu kullanımların hepsi ($regsubex detaylı string girdileri hariç) silinecek veya değiştirilecek kısmı tam olarak ayıklar. Örnek: Text-imiz şöyle olsun: deneme deneme2 deneme3 deneme4 ene Ve biz bu text içerisinde "ene" kelimesini silmek istiyoruz. Bunun için Türkiye'de en çok ezbere kullanılan tanım $remove olacaktır. Peki deneyelim bakalım. Kod: //var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $remove(%s,ene) Kod: -> dme dme2 dme3 dme4 Peki bu durumda ne yapabiliriz? Örneğin $replace kullanalım. Kod: //var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,ene,) Kod: -> dme dme2 dme3 dme4 Değişik bir kullanım deneyelim. Kod: //var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,$chr(32) $+ ene,) Kod: -> deneme deneme2 deneme3 deneme4 İşte bu durumda kullanmamız gereken token $remtok tanımıdır. Hemen deneyelim: Kod: //var %s = deneme deneme2 ene enedeneme3 deneme4 ene | echo -> $remtok(%s,ene,0,32) Kod: -> deneme deneme2 enedeneme3 deneme4 Bu konuya bu kadar değinmemin sebebi, ileri seviye coder-ların dahi düştüğü basit hatalardan birisidir yukarıdaki kullanımlar. 6- Kelime Sayısı Belirlemede Kullanımlar mIRC Scripting-de özelliklere olaylara dayalı kodlarda genellikle cümle içerisinde kaç kelime var olduğu alınır. Bu tür bir işlevde genellikle $numtok($1-,32) veya $gettok($1-,0,32) gibi tanımlar kullanılır. Bu kullanımlar her ne kadar yanlış olmasada, olaylar içerisinde daha basit bir kullanımı mIRC bize olanak tanımıştır. Bakınız: $0 Örnek: Kod: on *:text:*:#:echo -> Text-deki toplam kelime sayısı: $0 Örnek: Kod: //var %s = deneme-deneme1-deneme2-deneme3 | tokenize 45 %s | echo -> $0 7- Tekil İleti Penceresi Kullanımı mIRC üzerinden bağlantı kurduğunuz bir server-da size mesaj gönderen, veya siz tarafından mesaj gönderilen nickler için query penceresi açılır. Text gönderimi/alımı bu pencereler üzerinden yapılılır. Bu tür pencereler üzerinde işlev yapmak için, genellikle: Kod: on *:text:*:?:işlev Peki bütün özele gönderilen text-lerin hepsini otomatik olarak kişiye özel query penceresi açmaksızın tek bir pencere nasıl görüntüleyebiliriz dersek. Kod: /dqwindow [on|off|show|hide|min] Açıklama: on/açmak - off/kapatmak - show/pencereyi göstermek - hide/pencereyi saklamak - min/pencereyi minimize konuma getirmek için kullanılır. /dqwindow on yaptığınızda, bu işlemi devreye sokmuş olursunuz. İşlem devreye girdikten sonra, herhangi birisinin özeline göndereceği text Messages penceresinde gösterilir. mIRC default olarak kişi tarafından gelen mesajları; Kod: *nick* text Messages penceresindeki editbox-da her daim /msg komutu aktiftir. Yani siz bir text gönderdiğinizde editbox-da /msg komutu yeniden çıkacaktır. Messages penceresi hakkında bazı bilgiler:
Sonuç olarak Messages penceresi üzerinden değişik kullanımlar ile, farklı korumalar veya işlevler yazılabilir. 8- Yığın Bellek Ayırma Hatası mIRC üzerinde kendi komutlarınızı veya tanımlarınızı alias üzerinden oluşturabilirsiniz. Kod: alias _d echo -c info Bu bir denemedir. Lâkin oluşturduğunuz bir alias içerisinde direkt aynı alias-ı kullanmaya kalktığınızda, 2. kez uygulanmaz. Daha doğrusu, eğer bir işlev varsa işlev gerçekleşir, 2. işlev 1. işlevi gerçekleştirecek bir işlemse, 2. işlev sunucuya gönderilir. Örnek: Kod: alias _d { Kod: * denemedir. Gördüğünüz gibi, 1 kez mIRC local olarak uyguladı ve 2. kez server-a komut olarak göndermeye kalktı. Yani aliaslar içerisinde aynı alias bazında kısır döngü kurmaya kalktığınızda, mirc buna müsade etmez. Peki alias-lar üzerinde internal kısır döngü oluşturulabilir mi? Evet oluşturulabilir. Yukarıdaki örnek-de geri dönüş işlemini 2. bir alias ile yapmaya kalkalım. Yani yapacağımız işlev şu şekilde: Kod: /işlev-a -> işlev-b Kod: alias _d1 { Karşımıza çıkan sonuç: Kod: * Error allocating stack memory (line 2, script.ini) Kısır döngü her koşulda sonucun değişmesi veya kısır döngünün kesilmesi için bu ikilemeyi standart olarak "255" defa uygular. Kısır döngü devam ediyorsa, yukarıdaki hatayı alırsınız. 9- Timer / Tokenize($*) İlişkisi Tokenize(/tokenize) hakkında yukarıdaki bölümlerde genişce açıklamalarda bulunduk. Lâkin bu bölümüzde daha farklı değişiklerden bahsedeceğiz. /tokenize komutu ile uygulanan $* tanımının ne işe yaradığını söylemiştik. Kısacası değinmek gerekirse, $* tanımı öncesine konan veya işlev içerisinde gerçekleştirilen işlemi ayırıcının algıladığı sayı kadar tekrarlar. Kısa bir örnek verelim: Kod: //tokenize 32 a b c | echo -> $* Kod: -> a Şimdi esas konumuza gelecek olursak, /tokenize komutu, /timer komutu ile beraber uygulandığında ne gibi farklı değişiklikler gösterebilir? Yukarıdaki diğer /tokenize açıklamamızda, $* tanımını sorgu için kullanmak istediğimizde /scid veya /scon komutları ile birlikte kullanmamız gerektiğimizi söylemiştik. Bunun sebebinin bu şekilde kullanıldığında, local bazlı olarak gönderilen sorgu veya işlemlerin SABİTLENEREK UYGULANMASI ve yine local bazlı cevap verme özelliğinin olmasıydı. Bunların haricinde(/scid - /scon) ek olarak $* tanımını sorgu veya tanıma yeni bir işlev amaçlı /timer içerisinde de kullanabiliyoruz. Örnek: Kod: //tokenize 32 deneme danama dinimi | scon -r echo -> $!regex(x, $* ,/([aie])/g) - $!regml(x,1) Kod: -> 3 - e Yukarıdaki gördüğünüz işlev gayet açık. Şimdi bunu /timer kullanarak nasıl yapabilir? Örnek: Kod: //tokenize 32 deneme danama dinimi | .timer 1 1 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1) Kod: -> 3 - e Kod: 1. sıradaki: deneme Kısacası ilk önce "deneme" kelimesi arandı, sonra "danama" ve en son olarak "dinimi" kelimesi. Sonuçlara bakarsanız ilk gönderilen /echo çıktısı "e" harfidir. Şimdi /timer ile bu işlev yapılırken sıralama değişebiliyormu? Evet değişebiliyor. Örneğin, timer-ın interval/aralık kısmını ile oynayalım. Yukarıdaki /timer işleminde 1 saniye sonra, 1 kez işlemi gerçekleştir diyoruz. Şimdi aşağıdaki vereceğimiz örnekde ise, işlemi hemen ve yine 1 kez gerçekleştir diyeceğiz. Bakalım sıralama da değişiklik olacakmı. Uygulanan komut: Kod: //tokenize 32 deneme danama dinimi | .timer 1 0 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1) Kod: -> 3 - i 10- $()/$eval Tanımlarındaki Kullanımlar. mIRC-deki en önemli tanımlardan birisi $eval tanımıdır. Bunu zaten kodlama ile içli dışlı olan kişiler her zaman bilirler. $eval(text,N) tanımı genellikle değişkenlerin verilerini değerlendirmek için kullanılır. Bunun haricinde, herhangi bir text-ide değerlendirebilir. N kısmına 0 girilirse, text kısmı değerlendirilmez. Eğer N kısmı girilmezse, otomatik "1" olarak tanımlanır. Bu konu altında $eval tanımının ne gibi değişiklikler ve bazende çok farklı sonuçlar verdiğini göreceksiniz. Örnekler Kod: Kod: //var %loop = a b c d | echo -> $(%loop,1) Kod: -> a b c d Kod: Kod: //var %loop = a b c d | echo -> $(%loop,0) Kod: -> %loop Kod: Kod: //var %loop = a b c d | echo -> $([ %loop ],1) Kod: -> a b c d Kod: Kod: //var %loop = a b c d | echo -> $([[ %loop ]],1) Kod: -> [ a b c d ] Kod: Kod: //var %loop = a b, c d | echo -> $([ [ %loop ] ],1) Kod: -> a b c d Kod: Kod: //var %loop = a b, c d | echo -> $([ [ %loop ] ],$*) Kod: Sonuç yok. Kod: Kod: //var %loop = a b,, $+ c d | echo -> $([ [ %loop ] ],1) Kod: -> a b c d Kod: Kod: //var %loop = a b $+ c d | echo -> $([ [ %loop ] ],0) Kod: -> [ a bc d ] Kod: Kod: //var %loop = $!(a b, $+ ,c d) | echo -> $([ [ %loop ] ],1) Kod: -> a b c d Kod: Kod: //var %loop = $calc(1 + 5) / 2 | echo -> $([ [ %loop ] ],1) Kod: -> 3 Kod: Kod: //var %loop = a $+ , % $+ loop $+ , $calc(6-1) | echo -> $(,$([ [ %loop ] ],1)) Kod: -> a Yukarıda gördüğünüz örnekler gibi, binlerce örnek daha yazılabilir. Bu örnekler sayesinde $eval tanımının(kısa hali $() tanımıdır) değerlendirme bazındaki etkilerini görmüş olursunuz. Eval($eval) hakkında bir kaç bilgi daha verelim. Aşağıdaki bilgilerde kullanımların aynı olduğu gösterilir. Kod: $eval(text,1) = $(text,1) 11- Timer Sabitleme Özelliğini Devre Dışı Bırakma Yolları Bildiğiniz gibi /timer, değişken bir yapısı olan tanımları veya değişkenleri, sabitler. Bu durum çoğu zaman kod yazımında istenilen sonuçların alınmamasına sebep olabilir. Örnek: Kod: //.timer 5 1 echo -> $ticks Kod: -> 6141385 Bunun sebebi /timer kullanım içerisinde olan <command> kısmını girilen veri ile sabitler. Yani size /echo ile $ticks tanımının verisini almaya kalksanız dahi, o anki $ticks tanımına ait olan veriyi echo-latır. Bunun önüne daha öncede nasıl geçilebileceğini söylemiştik. Örnek: Kod: //.timer 5 1 echo -> $!ticks Kod: -> 6301380 Şimdi daha açık yanlış ve doğru olan bir örnekle anlayalım. Yanlış kullanıma örnek: Kod: //.timer_ex 5 1 noop $ticks | echo -> $timer(_ex).com Kod: -> noop 6616533 - Doğru kullanıma örnek: Kod: //.timer_ex 5 1 noop $!ticks | echo -> $timer(_ex).com Kod: -> noop $ticks Şimdi, daha farklı yollar ile bu sabitlemenin önüne geçilebilirmi? Evet geçilebilir. Aşağıdaki kullanımlar $identifier -lar için örneklerdir. Kod: Kod: //.timer_ex 5 1 noop $ $+ ticks | echo -> $timer(_ex).com Kod: -> noop $ticks Kod: Kod: //.timer_ex 5 1 noop $+($,ticks) | echo -> $timer(_ex).com Kod: -> noop $ticks Kod: Kod: //.timer_ex 5 1 noop $($ticks,0) | echo -> $timer(_ex).com Kod: -> noop $ticks Söz konusu %loops (değişkenler) olduğunda yapmamız gerekenler aşağıdaki gibidir. Doğru kullanımlara örnekler: Kod: //set %loop deneme | .timer_ex 5 1 echo -a % $+ loop | echo -> $timer(_ex).com 12- Regsub(Ex) Hakkında Bazı Kullanımlar Regsubex bilindiği gibi belirtilen text-i, yine belirtilen kombinasyonlarla değiştirmenize ve birçok daha işlev yapmanıza olanak sağlayan ileri düzey bir tanımdır. Regex zaten mIRC içerisinde ayrı bir kütüphane olup, mIRC için biraz daha farklı uyarlanmış, metin içerisinde altmetinler elde etmek veya sorgular yapmak için kullanılan mükemmel bir tanımdır. Daha fazla uzatmadan, $regsubex ile alt-metinler nasıl elde edilir bir göz atalım. Yazının devamında ilk öncelikle normal bir scripting kodlayıcısının rahatlıkla anlayabileceği bilgiler verilecektir. Devamında biraz daha ileri düzey örneklerle dersimize son vereceğim. Standart, $regsubex kullanımı: $regsubex([name], text, re, subtext) Açıklaması: [name]: Bu kısım girilmesi mecburi bir alan değildir. Lâkin çok iç içe kullanılan regsubex-larda isim belirtmek $regml veya \belirleyici ile yakalanan veriyi almak için daha iyi olur. Bunun dışında evaluation bracket-lar kullanılabilir tabii, onu ilerleyen kısımlarda anlatacağım. text: Bu kısım altmetin elde edilecek esas metindir. re: Bu kısım değiştirilmesi gereken daha doğrusu alt metini belirleyen kısımdır-ki herşey burada konuşulur- .) subtext: Bu kısım ise "alt metin" dediğimiz kısımdır. Yani bize geri dönüş yaptıran yer. Buraya kadar anlaşılmayan birşey olmadığını varsayıp örneklere geçiyorum. Örnek: Kod: //echo -> $regsubex(deneme,/(e)/g,-) Kod: -> d-n-m- Yukarıda kullanılan (e) kısmımız yakalama işlemi için kullanılır. Bu şekilde "e" harfi yakalanan kısım olmuştur. Bunu daha iyi anlamak için: Kod: //echo -> $regsubex(deneme,/(e)/g,-) - Yakalanan: $regml(0) | while ($true) { inc -u %1 | echo -> $(%1,$!+ . yakalanan:) $$regml(%1) - Pos: $$regml(%1).pos } Kod: -> d-n-m- - Yakalanan: 3 Örnekler Kod: Kod: //echo -> $regsubex(deneme,/(e)/g,\n) Kod: -> d1n2m3 - Kod: Kod: //echo -> $regsubex(deneme,/(e)/g,\ $+ n) Kod: -> d\nn\nm\n - Kod: Kod: //echo -> $regsubex(deneme,/(e)/g,[ [ \ $+ n ] ]) Kod: -> d1n2m3 - Kod: Kod: //echo -> $regsubex(deneme,/(e)/g,$*) Kod: -> d`~$*n`~$*m`~$* Yukarıdaki örnekler ilk örnek hakkında detaylı kullanımlar için verilmiştir. Şimdi seviyeyi biraz daha yükselterek "subtext" kısmında sorgulamar yapabileceğimizi görelim. Örnekler Kod: Kod: //echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1,-,$v1)) Kod: -> scr1pt-ng tutor-al - Kod: Kod: //echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1 && \n != 3,-,$v1)) Kod: -> scr1pt-ng tutor3al Regsubex ile hiç external döngü kullanmadan alfabedeki harfleri sıralayalım mesela. Not: Normalde bu tür bir işlev için /while /goto vb. döngüler kullanılabilir. Kod: Kod: //echo -> $regsubex($str(-,26),/(.)/g,$chr($calc(96+ \n)) $chr(32)) Kod: -> a b c d e f g h i j k l m n o p q r s t u v w x y z Peki şimdi, yukarıdaki kullanımda ortaya çıkan text içerisinde, harflerden birisi küçük, diğeri büyük nasıl yapabiliriz? Deneyelim. Kod: Kod: //echo -> $regsubex($str(-,26),/(.)/g,$iif(2 // \n,$chr($calc(96+ \n)),$upper($chr($calc(96+ \n)))) $chr(32)) Kod: -> A b C d E f G h I j K l M n O p Q r S t U v W x Y z Böyle bir işlemi /while ile yapmaya kalktığımızda, söyle bir kod yazılabilir. Kod: alias char { Regsubex-li kodumuz: Internal Loop + $iif() sorgusu + Internal Sorgular Döngülü kodumuz: External Loop + $iif() sorgusu + /if sorgusu + Variables-lar + Harici echo çıktısı Aradaki farkı gördünüz. Unutmayınki mIRC bir external loop bitmeden, diğerini asla gerçekleştirmez. Lâkin aynı anda birden fazla internal loop kullanabilir. İki kullanım arasında 10.000 tekrarlı bir döngü ile bench yapıldığında sonuçlar: Regsubex: 12.963 ms Normal kodumuz: 16.489 ms Gördüğünüz gibi $regsubex kullandığımız kod daha hızlı çalışıyor. Sanırım buraya kadar anlaşılmayan birşey yok. Konu çizgisinden daha fazla çıkmadan $regsubex tanımımıza geri dönelim. Örneklere Devam Kod: Kod: //echo -> $regsubex(scripting tutorial,/(i)/g,[\t]) Kod: -> scr[$1]pt[$1]ng tutor[$1]al - Kod: Kod: //echo -> $regsubex(scripting tutorial,/(i)/g,[[ \t ]]) Kod: -> scr[ i ]pt[ i ]ng tutor[ i ]al - Kod: Kod: //echo -> $regsubex(scripting tutorial,/(i)/g,[ [ \t ] ]) Kod: -> scripting tutorial Regsubex hakkında söyleyeceklerim bu ders için bu kadardır. Regsubex konusu ap ayrı bir konudur. Hakkında çok daha fazlası yazılabilir. Ki zaten bu ders-de gereğinden fazla uzun oldu. O yüzden bu dersin 2. sürümünün büyük bir bölümü sadece regsubex hakkında olacaktır. Birkaç Bilgi
Dersimiz 12 madde başlığı altında sona ermiştir. Biraz uzun olduğu için söylenecek bir kaç konuyu, bu dersin ikinci sürümüne bırakmış bulunmaktayım. Onuda ne zaman yazarım? Pek bilinmez. .) |
Cevap: Scripting İleri Seviye Kuru bir teşekkürle geçemiyeceğimi anladım.Gerçekten hobi edinenler adına muazzam bir kaynak olduğunu belirtmeliyim.Gözüme çarpan $regsubex ve $* tokenize var mesela stabil kod yazma mantığına uygun identifierlar. Yazan ellerin dert görmesin,sağolasın. |
Cevap: Scripting İleri Seviye ne desem ki.. ? hersey meydanda, buyuk bir ustadan buyuk bir anlatim. |
Cevap: Scripting İleri Seviye Eline emeğine sağlık dostum. Zaman ayırıp tamamen karşılıksız ve hobi olarak yaptığın bu işteki çalışmalarını forumlardada paylaşman gerçekten çok güzel birşey. Bilgini kendine saklamıyorsun paylaşıyorsun öğretiyorsun. Teşekkür ederim bu güzel yazıyıda paylaştığın için iyi çalışmalar. |
Cevap: Scripting İleri Seviye Bu tür dersler herkez için bir + dır bu dersleri yazanları korumalıyız teşekkür ederim |
Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 20:17. |
Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net