Scripting İleri Seviye

L4roXyL

Profesyonel Üye
Katılım
16 Eki 2011
Mesajlar
124
Beğeniler
1
#1
Ders: Scripting İleri Seviye
Yazan: L4roXyL - Hasan AYDENİZ
Tarih: 17 Ağustos 2012
Not: mIRCScripting.net 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
Şeklinde bir aliasımız var. Bu aliası kullanalım.

Kod:
//echo $_x(d1) $_x(d2) $_x(d3) $_x(d4)
Yaptığımızda:

-> 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:
//echo --> $_x(d1) $_x(d2) [ $_x(d3) ] [ [ $_x(d4) ] ]
Şeklinde kullandığımızda sonuç aşağıdaki gibi olacaktır.

-> 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:
//echo --> $_x(d1) [ [ $_x(d2) ] $_x(d3) ] $_x(d4)

Sonuç:

-> d2
-> d3
-> d1
-> d4
--> d1 d2 d3 d4
Aşağıdaki kullanımda tamamen tersden sıralama yapacaktır.


Kod:
//echo --> $_x(d1) [ $_x(d2) [ $_x(d3) [ $_x(d4) ] ] ]

Sonuç:

-> 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:
//var %. = deneme,/(e)/g | echo $regex(%.)
Şeklinde bir kullanım yaptığınızda:

* 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:
//var %. = deneme,/(e)/g | echo -> $regex( [ %. ] )
Sonuç:


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:
//echo -> $!ticks
Yaptığınızda sonuç:



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

Kod:
//echo -> [ [ $!ticks ] ]
Sonuç:


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:
//var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> %:

Sonuç:

-> $time $chr(45) $day $chr(45) $fullname
-

Örnek:

Kod:
 //var %: = $!time $!chr(45) $!day $!chr(45) $!fullname | echo -> [ [ %: ] ]

Sonuç:

-> 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:
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:
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:
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:
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:
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:
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:
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:
/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:
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:
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:
//var %& = 5 | while (%&) { echo -> %& | dec %& }
Sonuç:

-> 5
-> 4
-> 3
-> 2
-> 1
Şeklinde basit bir örnek.

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

Kod:
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ç:

-> 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 ba*is nedir?

Scripting içerisinde aynı anda 2 döngü kullanamıyoruz.


Yukarıdaki örnekde gördüğünüz üzere özetlemek gerekirse:

-> 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:
alias _th {
  var %. 10
  tokenize 32 5 10 15 20 25 30 
  while (%.) {
    echo -> $calc($v1 + $*)
    dec %.
  }
}
Sonuç:

-> 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:
alias _th {
  var %. 10
  tokenize 32 5 10 15 20 25 30
  while (%.) {
    echo -> $*
    echo -> $v1
    dec %.
}
}
Sonuç:

-> 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:
alias _th {
  var %. 10
  tokenize 32 5 10 15 20 25 30 
  while (%.) {
    echo -> $v1
    echo -> $*
    dec %.
  }
}
Sonuç:

-> 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:
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $1-
Sonuç:

-> ex1 ex2 ex3 ex4
Şeklindedir. Yani komutdaki text kısmı artık ayrı birer kelimedir.


Örnek:

Kod:
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $2-3
Sonuç:

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:
//tokenize 32 ex1 ex2 ex3 ex4 | echo -> $*
Sonuç:

-> 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:
//tokenize 32 ex1 ex2 ex3 ex4 | scid 0 echo -> $!upper( $* )
Sonuç:

-> 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:
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:
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:
//tokenize 32 deneme deneme1 deneme2 | echo -> $left($*,3)
Sonuç:

-> `~$
-> `~$
-> `~$
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:
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $remove(%s,ene)
Sonuç:

-> 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:
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,ene,)
Sonuç:

-> dme dme2 dme3 dme4
Sonuç yine aynı.
Değişik bir kullanım deneyelim.

Kod:
//var %s = deneme deneme2 deneme3 deneme4 ene | echo -> $replace(%s,$chr(32) $+ ene,)
Sonuç:

-> 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:
//var %s = deneme deneme2 ene enedeneme3 deneme4 ene | echo -> $remtok(%s,ene,0,32)
Sonuç:

-> 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:
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:
//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
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:
[B]/dqwindow [on|off|show|hide|min][/B]
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ı;

Ş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:
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:
alias _d {
  echo -c info * denemedir.
  _d
}
/_d yaptığınızda sonuç:

* 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:

/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:
alias _d1 {
  if ($ticks) inc %. 
  _d2
}
alias _d2 {
  if ($online) inc %.
  _d1
}
Yapmanız gereken: /_d1 veya /_d2


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

* 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:
//tokenize 32 a b c | echo -> $*
Sonuç:

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:
//tokenize 32 deneme danama dinimi | scon -r echo -> $!regex(x, $* ,/([aie])/g) - $!regml(x,1)
Sonuç:

-> 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:
//tokenize 32 deneme danama dinimi | .timer 1 1 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1)
Sonuç:

-> 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;

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:
//tokenize 32 deneme danama dinimi | .timer 1 0 echo -> $!regex(x, $* ,/([aei])/g) - $!regml(x,1)
Sonuç:

-> 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:
//var %loop = a b c d | echo -> $(%loop,1)

Sonuç:



-


Kod:


Kod:
//var %loop = a b c d | echo -> $(%loop,0)

Sonuç:



-


Kod:


Kod:
//var %loop = a b c d | echo -> $([ %loop ],1)

Sonuç:


-


Kod:


Kod:
//var %loop = a b c d | echo -> $([[ %loop ]],1)

Sonuç:


-


Kod:


Kod:
//var %loop = a b, c d | echo -> $([ [ %loop ] ],1)

Sonuç:


-


Kod:


Kod:
//var %loop = a b, c d | echo -> $([ [ %loop ] ],$*)

Sonuç:


-


Kod:


Kod:
//var %loop = a b,, $+ c d | echo -> $([ [ %loop ] ],1)

Sonuç:


-


Kod:


Kod:
//var %loop = a b $+ c d | echo -> $([ [ %loop ] ],0)

Sonuç:


-


Kod:


Kod:
//var %loop = $!(a b, $+ ,c d) | echo -> $([ [ %loop ] ],1)

Sonuç:


-


Kod:


Kod:
//var %loop = $calc(1 + 5) / 2 | echo -> $([ [ %loop ] ],1)

Sonuç:


-


Kod:


Kod:
//var %loop = a $+ , % $+ loop $+ , $calc(6-1) | echo -> $(,$([ [ %loop ] ],1))

Sonuç:





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.

$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:
//.timer 5 1 echo -> $ticks
Sonuç:

-> 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:
//.timer 5 1 echo -> $!ticks
Sonuç:

-> 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:
//.timer_ex 5 1 noop $ticks | echo -> $timer(_ex).com
Sonuç:

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


-


Doğru kullanıma örnek:

Kod:
//.timer_ex 5 1 noop $!ticks | echo -> $timer(_ex).com
Sonuç:

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:
//.timer_ex 5 1 noop $ $+ ticks | echo -> $timer(_ex).com

Sonuç:


-


Kod:


Kod:
//.timer_ex 5 1 noop $+($,ticks) | echo -> $timer(_ex).com

Sonuç:



-


Kod:


Kod:
//.timer_ex 5 1 noop $($ticks,0) | echo -> $timer(_ex).com

Sonuç:


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:
//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:
//echo -> $regsubex(deneme,/(e)/g,-)

Sonuç:


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:
//echo -> $regsubex(deneme,/(e)/g,-) - Yakalanan: $regml(0) | while ($true) { inc -u %1 | echo -> $(%1,$!+ . yakalanan:) $$regml(%1) - Pos: $$regml(%1).pos }
Sonuç:

-> 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:
//echo -> $regsubex(deneme,/(e)/g,\n)

Sonuç:


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

-


Kod:


Kod:
//echo -> $regsubex(deneme,/(e)/g,\ $+ n)

Sonuç:



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

-


Kod:


Kod:
//echo -> $regsubex(deneme,/(e)/g,[ [ \ $+ n ] ])

Sonuç:



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:
//echo -> $regsubex(deneme,/(e)/g,$*)

Sonuç:


-> 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:
//echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1,-,$v1))

Sonuç:


-> 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:
//echo -> $regsubex(scripting tutorial,/(i)/g,$iif(\n != 1 && \n != 3,-,$v1))

Sonuç:


-> 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:
//echo -> $regsubex($str(-,26),/(.)/g,$chr($calc(96+ \n)) $chr(32))
Sonuç:

-> 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:
//echo -> $regsubex($str(-,26),/(.)/g,$iif(2 // \n,$chr($calc(96+ \n)),$upper($chr($calc(96+ \n)))) $chr(32))
Sonuç:

-> 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:
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:
//echo -> $regsubex(scripting tutorial,/(i)/g,[\t])

Sonuç:


-> 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:
//echo -> $regsubex(scripting tutorial,/(i)/g,[[ \t ]])

Sonuç:


-> 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:
//echo -> $regsubex(scripting tutorial,/(i)/g,[ [ \t ] ])

Sonuç:


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

Bu konuyu okuyanlar (Üyeler: 1, Misafirler: 0)

Üst