IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
21Beğeni(ler)
  • 21 Post By L4roXyL

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 26 Ağustos 2012, 01:33   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _x var %, $0 | while (%,) { echo -> $1 | dec %, } | return $~1

Şeklinde bir aliasımız var. Bu aliası kullanalım.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo $_x(d1) $_x(d2) $_x(d3) $_x(d4)

Yaptığımızda:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d1 -> d2 -> d3 -> d4 --> d1 d2 d3 d4

Sonucunu alırız doğal bir sıralama ile.
Şimdi ölçüm parantezlerini devreye sokalım, örneğin;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo --> $_x(d1) $_x(d2) [ $_x(d3) ] [ [ $_x(d4) ] ]

Şeklinde kullandığımızda sonuç aşağıdaki gibi olacaktır.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d3 -> d4 -> d1 -> d2 --> d1 d2 d3 d4

Gördüldüğü üzere sıralama değişti.
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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo --> $_x(d1) [ [ $_x(d2) ] $_x(d3) ] $_x(d4)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d2 -> d3 -> d1 -> d4 --> d1 d2 d3 d4

Aşağıdaki kullanımda tamamen tersden sıralama yapacaktır.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo --> $_x(d1) [ $_x(d2) [ $_x(d3) [ $_x(d4) ] ] ]

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d4 -> d3 -> d2 -> d1 --> d1 d2 d3 d4

Buraya kadar ölçüm parantezlerinin sıralama/öncelik tanıma hakkındaki işlevlerini gördük.

Lakin bu parantezler farklı kullanımlarda değişik etkiler yapabilir.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %. = deneme,/(e)/g | echo $regex(%.)

Şeklinde bir kullanım yaptığınızda:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
* Invalid parameters: $regex

Şeklinde bir hata alırsınız. Yani geçersiz parametreler hatası. Bu normaldir ve doğru bir bildirimdir.
Çü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:   Kodu kopyalamak için üzerine çift tıklayın!
//var %. = deneme,/(e)/g | echo -> $regex( [ %. ] )

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 3

Olarak dönecektir. Yani $regex tanımı, girdiyi doğru olarak algılayıp cevabı verecektir.

Devam edelim. Ölçüm parantezleri öncelik tanıma konusunda hemen hemen her yerde geçerlidir.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $!ticks

Yaptığınızda sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> $ticks

Yani tanımın kendisi dönecektir. İşte yine böyle durumlarda ölçüm parantezlerini devreye şu şekilde soktuğumuzda:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> [ [ $!ticks ] ]

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 19714235

Yani kısacası çift ölçüm parantezi kullandığımızda tanımda "!" olduğu halde yine işlevini görür.
Bu konu hakkında gelişmiş örnekler verelim.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> %:

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> $time $chr(45) $day $chr(45) $fullname

-

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> [ [ %: ] ]

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 19:39:28 - Sunday - xlis

Buraya kadar ölçüm parantezleri hakkında, öncelik tanıma ve değer belirleme örneklerini gördük.
Ö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:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*deneme*:#:işlev

Kullanımı, bulunduğumuz herhangi bir kanalda içerisinde "deneme" kelimesi geçen bir satır/text/yazı gönderildiğin -de- demektir.
Yukarıdaki kullanım aşağıdaki kullanım ile aynı işlevi görür:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*:#:if (*deneme* iswm $1-) işlev

Bu kullanımlar zaten bildiğiniz şeyler.

Bazende ilk kelime şu olsun ve eğer 2. hatta 3. kelime varsa işlem yapalım gereksinimi duyulur.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*:#:if ($1 = !deneme && $2) işlev

Kullanımı, bulunduğunuz herhangi bir kanala gönderilen text-lerden birinci kelime($1) !deneme ise ve(&&) ikinci kelime($2) varsa demektir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:!deneme &:#:işlev

Yaptığınızda yukarıdaki kullanım ile aynı işlevi görecektir.
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:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:!deneme & &:#:işlev

Açıklaması: Bulunduğunuz herhangi bir kanala gönderilen text-ler içerisinde ilk kelime !deneme ise ve ikinci(ilk &) üçüncü(ikinci &) varsa demektir.

Yani aşağıdaki kullanımlar ile aynıdır.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*:#:if ($1 = !deneme && $2 && $3) işlev on *:text:!deneme*:#:if ($2 && $3) işlev on *:text:*:#:if ($1 = !deneme && $3) işlev

Vesaire.
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:   Kodu kopyalamak için üzerine çift tıklayın!
on $*:text:/^(merhaba|slm)$/iS:#:echo -> $regml(1)

Açıklaması: Bulunduğunuz herhangi bir kanalda gönderilen text-ler slm veya merhaba kelimesi ile başlayıp/bitiyorsa /echo ile yakalanan veriyi yansıt demektir.
Bilindiği üzere matchtext kısmında %değişken de kullanabilirsiniz.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
/set %d *deneme* on *:text:%d:#:işlev

Açıklaması: Gönderilen text içerisinde deneme kelimesi geçiyorsa demektir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _d return /^(s(e|)l(a|)m|m(e|)rh(a|)b(a|))$/iS on $*:text:$($_d):#:işlev

Açıklama: Oluşturduğumuz _d ismindeki aliasımıza geriye dönüş işlemi ile(/return) bir regular expression eşleşmesi atadık. Bu eşleşme esasınsa slm/selam/selm/slam - mrhb/merhb/mrheba/merhaba/mrhba vs. kelimeleri ile eşleşir. Kısacası bulunduğumuz herhangi bir kanalda bu kelimelerden birisi gönderilen text-ler arasında sadece $1(1. kelime) ise işlev yapılır.

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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _ct { if ($1 = chan) return #deneme,#deneme2,#deneme3,#deneme4 if ($1 = text) return /^!(op|sop|out|ban|notice|voice|hop|ban|kick)/iS } on $*:text:$($_ct(text)):$($_ct(chan)):echo -> İŞLEV.

Açıklaması: Oluşturduğumuz _ct ismindeki aliasımızın kullanım şeklinde eğer 1. kelime($1) chan ise kanallar dönecek, eğer yine 1. kelime text ise belirttiğimiz regular expression string-i dönecektir. Yani kısacası TEXT olayında; _ct aliasında bulunan kanallar kısmındaki herhangi bir kanalda, text kısmında bulunan herhangi bir text gönderildiğinde /echo komutu(değiştirilebilir) uygulanır.


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:   Kodu kopyalamak için üzerine çift tıklayın!
//var %& = 5 | while (%&) { echo -> %& | dec %& }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 5 -> 4 -> 3 -> 2 -> 1

Şeklinde basit bir örnek.

Peki /while içerisinde /while kullanılabilirmi? Evet kullanılabilir.
Ciddi bir örnek verelim:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias _wh { var %: = 3,%; = 6,%' = 9 while (%:) { echo -> First Loop: $v1 if ($v1 = 2) { while (%;) { echo -> Second Loop: $v1 if ($v1 = 4) { while (%') { echo -> Last Loop: $v1 dec %' } } dec %; } } dec %: } }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> First Loop: 3 -> First Loop: 2 -> Second Loop: 6 -> Second Loop: 5 -> Second Loop: 4 -> Last Loop: 9 -> Last Loop: 8 -> Last Loop: 7 -> Last Loop: 6 -> Last Loop: 5 -> Last Loop: 4 -> Last Loop: 3 -> Last Loop: 2 -> Last Loop: 1 -> Second Loop: 3 -> Second Loop: 2 -> Second Loop: 1 -> First Loop: 1

Açıklaması: Oluşturduğumuz /_wh aliasımız 3 adet while döngüsü kullanılır. İlk döngüde değeri ilk başta %: değişkeni 2 ile eşleştiğinde, 2. döngü başlatılır. 2. döngüdeki değeri ilk başta 6 olan %; değişkeni 4 ile eşleştiğinde, 3. döngü başlatılır. 3. döngü 0 ile eşleştiğinde, 2. döngü devam eder. Ve 2. döngü yine 0 ile eşleştiğinde, ilk döngü son olarak devam ederek 0 ile eşleşir ve döngülerin tamamı kapatılır.

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:   Kodu kopyalamak için üzerine çift tıklayın!
-> Start First Loop --> Start Second Loop ---> Pause First Loop ----> Start Last Loop -----> Pause Second Loop ----> Finish Last Loop ---> Continue Second Loop --> Finish Second Loop --> Continue First Loop -> Finish First Loop

Şeklindedir.

Döngüler hakkında bir kaç bilgi daha verelim.
  • While döngüsü içerisinde /goto komutunu döngü olarak kullanamazsınız.
  • Goto döngüsü içerisinde /while komutunu döngü olarak kullanamazsınız.
  • Goto içerisinde döngü olarak goto kullanamazsınız. (ilk goto-da bir döngü ise eğer)
Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias _th { var %. 10 tokenize 32 5 10 15 20 25 30 while (%.) { echo -> $calc($v1 + $*) dec %. } }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 10 -> 10 -> 10 -> 10 -> 10 -> 10

Açıklama: Farkındaysanız 10 tekrarlı bir döngü oluşturuyoruz. Lakin çıkan sonuç sayısı 6 adet. Bunun sebebi /tokenize ile ayrıştırdığımız(32 boşluk karakteri) "5 10 15 20 25 30" verileri toplam 6 adettir. Ve $* tanımını aynı komut içerisinde(/echo) kullandığımız için while döngüsü başlamaz. $* işlemi uygulanır ve dolayısıyla 6 tekrar yapılır. Sonuçların devamlı 10 çıkmasının sebebi döngüyü 10-dan aşağıya 0-a eşleşinceye kadar /dec ettirdiğimiz için, ilk döngünün değişkeni sabitlenir. Zaten ilk döngüde çıkan sonuçda 10 dur.

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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _th { var %. 10 tokenize 32 5 10 15 20 25 30 while (%.) { echo -> $* echo -> $v1 dec %. } }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 5 -> 10 -> 15 -> 20 -> 25 -> 30 -> 10 -> 9 -> 8 -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1

Diğer olarak eğer ilk başta döngünün diğer komutunu ve sonraki işleve $* atarsak, ilk döngü atanmış olan esas komutu 1 defalığına gerçekleştirir. Devamında $* ya atanmış işlemleri gerçekleştirir. Bu işlemler sonlandığında, döngü devam eder.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias _th { var %. 10 tokenize 32 5 10 15 20 25 30 while (%.) { echo -> $v1 echo -> $* dec %. } }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 10 d -> 5 t -> 10 t -> 15 t -> 20 t -> 25 t -> 30 t -> 9 d -> 8 d -> 7 d -> 6 d -> 5 d -> 4 d -> 3 d -> 2 d -> 1 d

Açıklama: Sonuç kısmında d ve t harflerini ben manuel olarak ekledim. d = döngü / t = tokenize anlamındadır. Anlamanız daha basit olacaktır bu şekilde.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $1-

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> ex1 ex2 ex3 ex4

Şeklindedir. Yani komutdaki text kısmı artık ayrı birer kelimedir.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $2-3

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> ex2 ex3

Buraya kadar basit /tokenize kullanımlarını gördük.

Ş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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $*

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> ex1 -> ex2 -> ex3 -> ex4

Buraya kadar anlaşılmayan birşey yok sanırım. Zaten bunlar bildiğiniz bilgiler.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 ex1 ex2 ex3 ex4 | scid 0 echo -> $!upper( $* )

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> EX1 -> EX2 -> EX3 -> EX4

Not: /scid kullanmamızın sebebi, işlevi sabitleyerek uygular(/timer-ın sabitleme özelliği gibi) üzerinde uygular. Dolayısıyla $!upper kısmı internal döner.($upper(text))

$* 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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _nl { var %. = 1,%v1 while ($token($snicks,%.,44)) { %v1 = $v1 if ($left(%v1,1) = $1) { echo -> %v1 } inc %. } }

Kullanım: /_nl <harf>

Şimdi aynı işlevi $* ile yapalım.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias _nl2 { var %. $1 tokenize 44 $snicks scid 0 !if $!left( $* ,1) = %. { echo -a -> $* } }

Kullanımı: /_nl2 <harf>

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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 deneme deneme1 deneme2 | echo -> $left($*,3)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> `~$ -> `~$ -> `~$

Gördüğünüz gibi normalde kelimelerin sol baştan ilk 3 harfini /echo yapması gerekirken(den), `~$ verisi echo-landı.
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:   Kodu kopyalamak için üzerine çift tıklayın!
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $remove(%s,ene)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> dme dme2 dme3 dme4

Evet ene kelimesi silindi. Lakin diğer kelimeler içerisindede olduğu için, onlarda ayıklandı. Yani kısacası bu işlev yanlış bir işlem olmuş durumda.
Peki bu durumda ne yapabiliriz?

Örneğin $replace kullanalım.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,ene,)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> dme dme2 dme3 dme4

Sonuç yine aynı.
Değişik bir kullanım deneyelim.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,$chr(32) $+ ene,)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> deneme deneme2 deneme3 deneme4

Bu sefer oldu. Lâkin ene kelimesi ortada da olabilirdi veya baştada olabilirdi. Yani dolayısıyla bu yine yeterli bir kullanım olmayacaktır. Hatta yanlış bir kullanım.

İşte bu durumda kullanmamız gereken token $remtok tanımıdır.

Hemen deneyelim:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %s = deneme deneme2 ene enedeneme3 deneme4 ene | echo -> $remtok(%s,ene,0,32)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> deneme deneme2 enedeneme3 deneme4

Sonuç doğru. Gördüğünüz gibi tam eşleşme yaparak ayıklama işlemi gerçekleşti.

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:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*:#:echo -> Text-deki toplam kelime sayısı: $0

Tanım $0 /tokenize komutuyla herhangi bir ayrıştırma işlemi yapıldığında da kullanılabilir.

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//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:   Kodu kopyalamak için üzerine çift tıklayın!
on *:text:*:?:işlev

Kullanılmaktadır.
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:   Kodu kopyalamak için üzerine çift tıklayın!
/dqwindow [on|off|show|hide|min]

Komutunu kullanabilir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
*nick* text

Şeklinde gösterecektir.
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:
  • Messages penceresi size özel gönderilen tüm text-leri görüntüler.
  • Pencere default olarak "message" olarak tanımlanır.
  • Pencere içerisinde harf+TAB kombinasyonu kullanılabilir. Örneğin, iletişim kurulan nickler arasında deneme nick-i varsa, d+TAB kombinasyonu uyguladığınızda o nick otomatik tanımlanır.
  • Pencere üzerindeki text-leri görüntülemek için en basitinden, $line(message window,N) kullanılabilir.
  • /dqwindow off yapmadığınız sürece, özeline karşı tarafdan gelen text-ler her daim Messages penceresinde gösterilir.
  • Pencere içerisinde HOTLINK aktiftir. Herhangi bir nick-in üzerine tıkladığınızda işlem görebilir.
  • Pencerede çift tıklama işlemi yaptığınızda, son iletişim kurulan nick-e double click işlemi(default olarak /whois-dir) uygulanır.
  • Pencere üzerinden iletişime geçilen herhangi bir nick ile kendiniz /query penceresi açtığınızda, o kişi ile olan ileti geçmişiniz otomatik yüklenir. Ve kişinin gönderdiği text-ler query penceresinde görüntülenir. Kısacası Messages penceresi ile bağlantısı kesilir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _d echo -c info Bu bir denemedir.

Gibi(kullanım: /_d)

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:   Kodu kopyalamak için üzerine çift tıklayın!
alias _d { echo -c info * denemedir. _d }

/_d yaptığınızda sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
* denemedir. - * /_d: not connected to server (line 13, script20.ini)

Uyarılarını alırsınız. Bunun sebebi, oluşabilecek kısır döngüleri engellemek içindir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
/işlev-a -> işlev-b /işlev-b -> işlev-a

Bu tablo bir kısır döngüdür. Bir örnekle deneyelim.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias _d1 { if ($ticks) inc %. _d2 } alias _d2 { if ($online) inc %. _d1 }

Yapmanız gereken: /_d1 veya /_d2

Karşımıza çıkan sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
* Error allocating stack memory (line 2, script.ini)

İşte bu uyarının sebebi, yığın belleğe yüklenmede ayırma hatası gerçekleşmesinden kaynaklanır.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 a b c | echo -> $*

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a -> b -> c

Gördüğünüz gibi /echo işlemi 3 defa tekrarlandı. Buna sebeb olan "a b c" texti-i içerisinde 3 ayrıştırma işlemi olmasıdır(32/white-space)
Ş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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 deneme danama dinimi | scon -r echo -> $!regex(x, $* ,/([aie])/g) - $!regml(x,1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 3 - e -> 3 - a -> 3 - i

Açıklaması: "deneme danama dinimi" kelimelerini /tokenize 32 ile ayrıştırdık. Elde edilen 3 kelimeyi /scon ile $regex tanımını kullanarak içerisinde string karşılaştırmaları yaptık. Sonuç olarak her kelimenin içerisinde "e, i ve a" harfleri arandı.

Yukarıdaki gördüğünüz işlev gayet açık.
Şimdi bunu /timer kullanarak nasıl yapabilir?

Örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 deneme danama dinimi | .timer 1 1 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 3 - e -> 3 - a -> 3 - i

Gördüğünüz gibi aynı işlem gerçekleşti. Sonuca dikkat ederseniz /tokenize ile ayrılan kelimeler;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
1. sıradaki: deneme 2. sıradaki: danama 3. sıradaki: dinimi

Yani burada internal bir sıralama şekli var. Ve farkındaysanız /timer-da /scon-da bize sonuçları sıralama yolunu takip ederek verdi.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//tokenize 32 deneme danama dinimi | .timer 1 0 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 3 - i -> 3 - a -> 3 - e

Görüldüğü gibi sıralamada değişiklik oldu. Timer interval kısmı ile oynanınca, sıralamada değişiklik gösterdi ve yukarıdaki sonuçların tam tersi olarak, tersden string karşılaştırması yapıldı.


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:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b c d | echo -> $(%loop,1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a b c d

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b c d | echo -> $(%loop,0)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> %loop

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b c d | echo -> $([ %loop ],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a b c d

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b c d | echo -> $([[ %loop ]],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> [ a b c d ]

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b, c d | echo -> $([ [ %loop ] ],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a b c d

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b, c d | echo -> $([ [ %loop ] ],$*)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
Sonuç yok.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b,, $+ c d | echo -> $([ [ %loop ] ],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a b c d

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a b $+ c d | echo -> $([ [ %loop ] ],0)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> [ a bc d ]

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = $!(a b, $+ ,c d) | echo -> $([ [ %loop ] ],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> a b c d

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = $calc(1 + 5) / 2 | echo -> $([ [ %loop ] ],1)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 3

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//var %loop = a $+ , % $+ loop $+ , $calc(6-1) | echo -> $(,$([ [ %loop ] ],1))

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 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:   Kodu kopyalamak için üzerine çift tıklayın!
$eval(text,1) = $(text,1) $eval(text,0) = $(text,) $eval(text,1) = $(,text) $eval(text,1) = $evalnext(text) $eval(text,0) = $(text,$+)

Evaluation hakkında söyleyeceklerim bu kadar.


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:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer 5 1 echo -> $ticks

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 6141385 -> 6141385 -> 6141385 -> 6141385 -> 6141385

Görüldüğü gibi, $ticks tanımı /timer komutunu ilk açtığımız an sabitlendi. Ve devamlı aynı veriyi bize verdi.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer 5 1 echo -> $!ticks

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 6301380 -> 6302394 -> 6303408 -> 6304422 -> 6305436

Görüldüğü gibi $ticks tanımının verileri doğru bir şekilde yansıtıldı.
Şimdi daha açık yanlış ve doğru olan bir örnekle anlayalım.

Yanlış kullanıma örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer_ex 5 1 noop $ticks | echo -> $timer(_ex).com

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> noop 6616533

Görüldüğü gibi, $ticks sabitlenmiş.

-

Doğru kullanıma örnek:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer_ex 5 1 noop $!ticks | echo -> $timer(_ex).com

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> noop $ticks

Görüldüğü gibi $ticks tanımı, doğru olarak sonuç verecektir. Çünki /timer her defasında, tanıma ait olan veriyi sabitleyerek değilde, tanıma ait olan veriyi online olarak verecektir.

Ş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:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer_ex 5 1 noop $ $+ ticks | echo -> $timer(_ex).com

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> noop $ticks

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer_ex 5 1 noop $+($,ticks) | echo -> $timer(_ex).com

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> noop $ticks

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//.timer_ex 5 1 noop $($ticks,0) | echo -> $timer(_ex).com

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> noop $ticks

Bu vb. yollar ile tanımlar için olan sabitleme özelliğini devre dışı bırakabiliriz.

Söz konusu %loops (değişkenler) olduğunda yapmamız gerekenler aşağıdaki gibidir.

Doğru kullanımlara örnekler:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//set %loop deneme | .timer_ex 5 1 echo -a % $+ loop | echo -> $timer(_ex).com ;- //set %loop deneme | .timer_ex 5 1 echo -a $(%loop,0) | echo -> $timer(_ex).com ;- //set %loop deneme | .timer_ex 5 1 echo -a $var(%loop,1) | echo -> $timer(_ex).com

Timer sabitleme özelliği hakkında söyleyeceklerim bu kadar.


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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,-)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d-n-m-

Açıklaması: İlk olarak "/" kısmı karşılaştırmadır. Yani /g(çoklu arama) kullanabilmemiz için bu kısmın girilmesi gerekmektedir. Yani kısacası bir karşılaştırma şu şekilde tanımlayabilirsiniz: /text/parametre
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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,-) - Yakalanan: $regml(0) | while ($true) { inc -u %1 | echo -> $(%1,$!+ . yakalanan:) $$regml(%1) - Pos: $$regml(%1).pos }

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d-n-m- - Yakalanan: 3 -> 1. yakalanan: e - Pos: 2 -> 2. yakalanan: e - Pos: 4 -> 3. yakalanan: e - Pos: 6

Sanırım buraya kadar anlaşılmayan birşey yok. Şimdi gelişmiş kullanımlara geçelim.

Örnekler

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,\n)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d1n2m3

Açıklaması: \n anahtarı yakalanan verileri sayıyla gösterir.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,\ $+ n)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d\nn\nm\n

Açıklaması: \ $+ n kullandığımız için, sabitlenen bir text olarak görüldü.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,[ [ \ $+ n ] ])

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d1n2m3

Açıklaması: Evaluation brackets kullandığımız için sabitleme özelliği göz ardı edildi. Yukarıda daha detaylı bilgi alabilirsiniz eva-brackets hakkında.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(deneme,/(e)/g,$*)

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> d`~$*n`~$*m`~$*

Açıklaması: $* tanımının /tokenize kullanmasak bile internal olarak `~$ şeklinde döndüğünü söylemiştik.
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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1,-,$v1))

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> scr1pt-ng tutor-al

Açıklaması: \n parametresinin yakalanan verilerin kaç adet olduğunu sayı olarak verdiğini söylemiştik. Burada yaptığımız işlev, \n eğer 1-e eşit değilse "-" karakteri olarak dönsün diyoruz. Görüldüğü gibi $regsubex içerisinde sorgu kullanabiliyoruz $iif() ile.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1 && \n != 3,-,$v1))

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> scr1pt-ng tutor3al

Açıklaması: \n 1-e veya 3-e eşit değilse, "-" karakteri olarak dönsün. Aksi halde $v1(kendisi) olarak dönebilir.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex($str(-,26),/(.)/g,$chr($calc(96+ \n)) $chr(32))

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 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

Açıklaması: "-" karakterinden(ki bu örnektir) 26 adetlik bir text içerisinde, (.) herhangi bir karakteri yakaladık. Buda bize 26 karakterin tümünüde yakalamıza olanak sağladı. Devamında $calc(96+ \n) ile \n ile alınan sayıları +96 olarak değiştirdik. Devamında $chr() ile bu sayıların ascii karakterini görüntüledik. Son olarak $chr(32) kullanarak her harf arasına boşluk koyduk.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex($str(-,26),/(.)/g,$iif(2 // \n,$chr($calc(96+ \n)),$upper($chr($calc(96+ \n)))) $chr(32))

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> 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

Görüldüğü gibi ek bir $iif() sorgusu ile bu işlemi gerçekleştirdik. Mantık gayet basittir. Burada denilen şey; eğer \n sayısı, 2 sayısının katları ise karakter normal dönsün. Eğer değilse, karakterler $upper() ile harf(ler) büyütülsün.

Böyle bir işlemi /while ile yapmaya kalktığımızda, söyle bir kod yazılabilir.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
alias char { var %loop = 1,%loop2,%v1 while ($chr($calc(96+ %loop))) { %v1 = $v1 %loop2 = %loop2 $iif(2 // %loop,%v1,$upper(%v1)) if (%loop = 26) break inc %loop } echo -> %loop2 }

Şimdi her iki koda baktığımızda aradaki fark nedir? Kısa bir bechmark yapalım.

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:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(scripting tutorial,/(i)/g,[\t])

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> scr[$1]pt[$1]ng tutor[$1]al

Açıklaması: Evaluation bracket tek kullandığımız için, alt-metin $1 şeklinde döndü.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(scripting tutorial,/(i)/g,[[ \t ]])

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> scr[ i ]pt[ i ]ng tutor[ i ]al

Açıklaması: Evaluation bracket iki tane yan yana kullandığımız için, ilki karakter olarak döner. 2.-si öncelik tanıma işlemini yapar.

-

Kod:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//echo -> $regsubex(scripting tutorial,/(i)/g,[ [ \t ] ])

Sonuç:

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
-> scripting tutorial

Açıklaması: \t(toplam karşılaştırma) olması gerektiği gibi döndü. Çünkü evaluation bracket-lar işlemini tam manası ile görmüş bulunmaktadır. Yani


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
  • /debug çıktıları her sunucu için ayrı çalışır.
  • /rmdir komutunda, klasör eğer dosya içeriyorsa silinemez.
  • /write komutu ile ini dosyasına birşey yazdıramazsınız. Herhangi bir veri yazdırdığınız taktirde, dosyanın işleyişi bozulabilir.
  • $?*!="text" ve $input() tanımını hiçbir olaya dayalı script kodları içerisinde kullanamazsınız. Çalışmaz.
  • /dcc fserve komutları IP adresi üzerinden iletişim kurar, IRC üzerinden çalışmaz/gerek duymaz.
  • /scid ve /scon komutlarında herhangi bir $identifier kullanmak istiyorsanız, $!identifier şeklinde kullanmalısınız. Bu şekilde tanımların ilk değerlerinden kurtulmasına olanak sağlar.
  • Socket kullanırken belirttiğiniz socket ismi en fazla 90 karakter olabilir.
  • Hash table oluştururken belirttiğiniz tablo ismi en fazla 90 karakter olabilir.
  • Olaylar içerisinde(text, notice vb) $rawmsg kullanırsanız, gelen veri debug çıktısından gelen veri ile aynı olarak ham şekilde gelecektir.


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. .)


Konu L4roXyL tarafından (12 Ekim 2012 Saat 19:15 ) değiştirilmiştir.
 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları tatlim sohbet Mobil Chat
Alt 26 Ağustos 2012, 02:54   #2
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
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.

 
Alıntı ile Cevapla

Alt 27 Ağustos 2012, 22:19   #3
Çevrimiçi
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: Scripting İleri Seviye




ne desem ki.. ?

hersey meydanda, buyuk bir ustadan buyuk bir anlatim.

__________________
- maybe this world is another planet's hell.
 
Alıntı ile Cevapla

Alt 30 Ağustos 2012, 12:08   #4
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
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.

 
Alıntı ile Cevapla

Alt 28 Eylül 2012, 20:09   #5
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: Scripting İleri Seviye




Bu tür dersler herkez için bir + dır bu dersleri yazanları korumalıyız teşekkür ederim

 
Alıntı ile Cevapla

Cevapla

Etiketler
scripting, seviye, İleri


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
İşte İleri Demokrasinin İleri Hukuku : Hükmü Cezaevi Müdürü Veriyor N999 Haber Arşivi 0 31 Mart 2012 16:09
İleri KarakıZ İslamiyet 0 01 Aralık 2011 23:14
İleri KarakıZ İslamiyet 0 28 Kasım 2011 13:29
İleri Geri Frozen Aşk ve Sevgi Köşesi 0 04 Şubat 2011 00:24
Kanalda Seviye Editor mIRC Scripting Sorunları 10 07 Mayıs 2008 22:04