Anasayfa
UO Sunucular
Forumlar
Profilim
UO-Developer.COM
STRING Functionları

EXPLODE

EXPLODE işlevi, bir dizeyi bir veya daha fazla sınırlayıcıya dayalı olarak virgülle ayrılmış bir listeye dönüştürmek için kullanılabilir. Ortaya çıkan dize daha sonra tek tek parçalara erişmek için ARGV'yi kullanabileceğiniz bir işleve geçirilebilir.

Komutun sözdizimi şöyledir: EXPLODE ayırıcıları, string_to_separate

Bir dizeyi hem "-" hem de "+" karakterleriyle ayıran ve çıktıyı Sphere konsoluna kaydeden aşağıdaki örneğe bakın:
[FUNCTION f_explode]
F_EXPLODE_LOG <EXPLODE -+,<ARGS>> // dizeyi - ve + ile ayırın, sonucu F_EXPLODE_LOG işlevine aktarın
[FUNCTION f_explode_log]
SERV.LOG ARGV Length = <ARGV>           // virgülle ayrılmış bağımsız değişkenlerin çıktı sayısı
FOR 0 <EVAL (<ARGV> - 1)>               // her argüman boyunca döngü
    SERV.LOG ARGV[<LOCAL._FOR>] = <ARGV[<LOCAL._FOR>]> // bireysel argümanların çıktısı
ENDFOR
STRARG

STRANG, bir dizeden ilk kelimeyi çıkarmak için kullanılabilir. Aşağıdaki örnek bunu göstermektedir:
[FUNCTION f_strarg]
SERV.LOG <STRARG One Two Three>
Konsola "One" kelimesinin çıktığını göreceksiniz.

STREAT

STREAT, STRARG'ın karşılığı olan fonksiyondur. STRARG size bir dizedeki ilk kelimeyi verirken, STREAT bir dizedeki ilk kelimeyi 'yiyecek' ve kalan metni geri verecektir. Aşağıdaki kod farkı gösterir:
[FUNCTION f_streat]
SERV.LOG <STREAT One Two Three>
Konsola "Two Three" yazısının çıktığını göreceksiniz.

STRCMP

Er ya da geç, bir dizeyi diğeriyle karşılaştırma ihtiyacı duyabilirsiniz. Aşağıdaki satırı yazmaya çalışarak başlayabilirsiniz:
IF ("String1" == "String2")
Bunu yapmaya çalışırsanız, Sphere konsolunda çirkin görünen bir hata bulursunuz ve IF ifadeniz hiç düzgün çalışmaz. Bunun nedeni, IF ifadelerinin sayısal değerleri karşılaştırmak için tasarlanmış olması ve bu nedenle iki dizeyi nasıl karşılaştırabileceğini anlayamamasıdır.

Yani "String1"in "String2"ye eşit olup olmadığını öğrenmeniz gerekiyor, değil mi? İşte bu yüzden STRCMP'miz var. Bunun temellerine bakalım.

STRCMP(string1, string2)

Şimdi, bunu kullanmaya başlamadan önce, bu işlevin eşitlik için sadece iki dizeyi karşılaştırmadığının farkında olmalısınız. STRCMP actualls, birbirinden küçük, büyük veya birbirine eşit olup olmadıklarını belirlemek için iki dizeyi karşılaştırır! Bu nedenle, bu işlevin üç farklı dönüş değeri vardır:

-1 String1, string2'den küçüktür
0 İki dize eşittir
1 String1, string2'den büyüktür

Fonksiyonu kullanırken bu dönüş değerlerini göz önünde bulundurmak önemlidir, çünkü hızlı bir şekilde keşfedeceğiniz gibi, iki dize birbirine eşit olduğunda fonksiyon aslında false (0) döndürür.

Aşağıdaki örnekte aşağıdakilere bir göz atın:
IF !(STRCMP(<SRC.NAME>, Tiny))
    SRC.SAY My name is Tiny!
ENDIF
"Neden işlevi < > orayla çevrelemek zorunda kalmadınız?" diye soruyor olabilirsiniz.

STRCMP 'normal' bir fonksiyon değildir. İçsel bir fonksiyon olarak bilinir, yalnızca bir ifadenin içinde kullanılabilen ve onun tarafından çevrelenmek yerine argümanları parantez ( ) ile çevrili olan özel bir fonksiyon türüdür.

"Bekle, ama o STRCMP bir EVAL'in içinde değil!?" diyebilirsiniz, ancak aslında durum böyle değil. Koşullu ifadelerin (IF ve WHILE gibi) içinde, Sphere otomatik olarak tüm satırı bir EVAL işlevinin içindeymiş gibi ele alır ve bu nedenle yukarıdaki komut dosyası dizeleri karşılaştırmak için iyi çalışır.

Hatırlamanız gereken başka bir şey de STRCMP'nin büyük/küçük harfe duyarlı olduğu ve bu nedenle "STRING1"un "string1"e eşit olmayacağıdır. Büyük/küçük harfe duyarlı olmayan bir karşılaştırma yapmak istiyorsanız, bunun yerine STRCMPI kullanın.

STRCMPI
STRCMPI işlevi, büyük/küçük harflerini göz ardı ederek iki dizeyi karşılaştırmak için kullanılabilir. Büyük/küçük harfe duyarlı olmamasının yanı sıra, bu işlev STRCMP ile aynıdır.

STRLEN
Bu işlev, bir dizedeki karakter sayısını saymak için kullanılabilir. Mesela:
LOCAL.LENGTH = <EVAL STRLEN(<ARGS>)>
Diyelim ki ARGS'nin değeri "Bu 26 karakterden oluşuyor" diyor. LOCAL'ın değeri. UZUNLUK 26 olacaktır.

STRPOS

STRPOS işlevi, bazı metinlerdeki belirli bir karakterin konumunu bulmak için kullanılabilir. Komutun sözdizimi şöyledir:

STRPOS pos ch string

Pos Aramaya başlanacak konum (ilk karakter 0 konumudur)
ch Aranacak karakter veya karakterin ASCII kodu
string Aranacak metin

İşte birkaç örnek:
LOCAL.POS = <STRPOS 0 32 Where is the first space>  // returns 5****
LOCAL.POS = <STRPOS 3 e Where is the first 'e'>     // returns 4****
STRREVERSE

Bu işlev basitçe bir dizenin sırasını tersine çevirir. Örneğin:
SERV.LOG <STRREVERSE Hello>
Yukarıdaki kod satırı konsola "olleH" çıktısı verecektir.

STRSUB

STRSUB, bir dizeden bir dizi karakter çıkarmak için kullanılır. Neden faydalıdır? Şu anda belirli bir sebep düşünemiyorum, ama eminim bununla başa çıkabileceksiniz.
[FUNCTION TestStrSub]
SERV.LOG <STRSUB 0 1 Hello>
Gördüğünüz gibi, STRSUB üç parametre alır. İlk parametre başlangıç konumudur (sıfır tabanlı). İkinci parametre uzunluktur. Son olarak, üçüncü parametre söz konusu dizedir.

Bu işlevi oyun içinde kullanacak olsaydınız, Sphere konsolunuza bakın, ilk karakteri üçüncü konumdan yazdırdığını göreceksiniz. Belirtmem gereken bir şey, indeksin (ilk parametre) sıfır tabanlı olmasıdır. Dizenin ilk karakterinden başlamak istiyorsanız, sıfır kullanmanız gerekir. İkinci parametre, Sphere'e dizinden başlayarak kaç karakter döndürmemiz gerektiğini söyler.

Dizin için negatif bir değer belirtmek, Sphere'e dizenin sonundan başlamasını ve oradan geriye doğru saymasını söyleyecektir. İşte bir örnek:
[FUNCTION TestStrSub]
SERV.LOG <STRSUB -1 1 Hello>
İşlevi oyun içinde bir kez daha kullanın, ardından Sphere konsolunuza bakın. Şaşırtıcı bir şekilde, dizenin son karakterini yazdırır.

STRTOLOWER

Bu işlev, tüm büyük harfli karakterleri küçük harfe dönüştürür. Basit bir örnek şöyle olabilir:
LOCAL.LOWER = <STRTOLOWER StRiNgS ArE fUn To PlAy WiTh>
İşlev, "dizelerle oynamak eğlencelidir" ifadesini döndürür.

STRTOUPPER

Bu işlev, STRTOLOWER'ın tam tersi bir eylem gerçekleştirir. Tüm küçük harfli karakterleri büyük harfe dönüştürür. Önceki örnekten yola çıkarak:
LOCAL.UPPER = <STRTOUPPER STRINGS ARE FUN TO PLAY WITH >
İşlev " STRINGS ARE FUN TO PLAY WITH " mesajını döndürür.

STRTRIM

Bu işlev, bir dizenin başından ve sonundan tüm boşlukları (boşluklar, sekmeler, yeni satırlar) çıkarmak için kullanılabilir.

Aşağıdaki komut dosyası bunu gösterir:
[FUNCTION f_strtrim]
LOCAL.TEXT = "TEST"
SERV.LOG 1. <LOCAL.TEXT>
SERV.LOG 2. <STRTRIM <LOCAL.TEXT>>
Çalıştırıldığında, Sphere konsolunda aşağıdaki çıktı görülecektir:

1. TEST
2. TEST

STRMATCH

STRMATCH işlevi, daha önce büyük olasılıkla karşılaştığınız joker karakterler (*) kullanarak bir dizenin basit bir ifadeyle eşleşip eşleşmediğini kontrol etmenizi sağlar.

Bu fonksiyonun sözdizimi STRMATCH(pattern, string) şeklindedir. Dize desenle eşleşirse 1, eşleşmezse 0 döndürür. Aşağıdaki örnek komut dosyasına bakın:
[FUNCTION f_strmatch]
IF (STRMATCH(*ex*, <ARGS>))
    SERV.LOG ARGS contains 'ex'!
ELSE
    SERV.LOG ARGS does not match.
ENDIF
Sphere konsolunda Meksika F_STRMATCH yazın. "ARGS şunu içerir: 'ex'!" mesajını göreceksiniz. Bunu anlayana kadar farklı argümanlarla denemeler yapmayı ve kalıbı değiştirmeyi deneyebilirsiniz.

Eğlendiniz mi? STRMATCH aslında bundan biraz daha güçlü. Aslında desen metninin içinde kullanabileceğiniz tek özel karakter değildir:

* Hiçbiri dahil olmak üzere herhangi bir sayıda karakterle eşleşir
? Tek bir karakterle eşleşir
[\*] *' karakteriyle eşleşir
[abcdef] Listedeki karakterlerden herhangi biriyle eşleşir
[!abc] [^abc] Listede olmayan karakterlerle eşleşir
[A'dan Z'ye] A ve Z arasındaki herhangi bir karakterle eşleşir.

STRMATCH hakkında bilmeniz gereken her şey bu. Ancak son bir not, desenin büyük/küçük harfe duyarlı olmayacağıdır. (*ex* örneği "METİN" ile eşleşecektir)

Not: Bazı kullanıcılar, STRMATCH işlevinin iki dizenin eşit olup olmadığını belirlemenin uygun bir yolu olduğunu da bulmuşlardır (yani IF (STRMATCH(string1, string2))). İşlevin bu şekilde kullanılması amaçlanmamıştır ve bunu yapmak için dezavantajlı olacaksınız:

• Sphere yine de bir desen eşleşmesi gerçekleştirmeye çalışacak ve CPU kaynaklarını boşa harcayacaktır.
• İlk dizede bir joker karakter kullanıldığında, istediğiniz sonucu alamayabilirsiniz (STRMATCH(, SOMETEXT)),'e benzer bir şey hayal edin ve ARGS'nin *MET* içerdiğini hayal edin)

İki dizenin eşitliğini kontrol etmek istiyorsanız, STRCMP veya STRCMPI işlevini kullanın.

STRREGEX

STRMATCH ne kadar kullanışlı olsa da, ne yazık ki daha kesin kalıpları eşleştirecek kadar güçlü değil.

Bir dizenin kayan noktalı bir sayı (bir veya daha fazla ondalık basamağı olabilen bir sayı) içerip içermediğini kontrol etmek istediğinizi düşünün. STRMATCH'i kullanarak şöyle bir şeyle başlayabiliriz:
[FUNCTION f_fpmatch]
IF (STRMATCH([0-9].[0-9], <ARGS>))
    SERV.LOG <ARGS> is a floating point number.
ELSE
    SERV.LOG <ARGS> is NOT a floating point number.
ENDIF
Sphere konsoluna 1.0 F_FPMATCH yazarsak eşleşme başarılı olur, ancak 9.9'dan büyük bir sayı veya tam olarak 1 ondalık basamağı olmayan bir sayı girmeye çalışırsak eşleşmez. STRMATCH'e daha fazla "[0-9]" ekleyebilirdik, ancak bu sorunu çözmez çünkü ne olursa olsun sabit bir sayı girmemiz gerekirdi. Örneğin, STRMATCH([0-9][0-9][0-9].[ 0-9][0-9][0-9], <ARGS&gt O zaman maçın 1.5 için çalışması için 001.500 girmemiz gerekir!</ARGS>

STRREGEX, gelişmiş desen eşleştirmesi gerçekleştirmek için normal ifade dilini kullanarak bu sorunu çözer. Aslında, o kadar gelişmiştir ki, desenler neredeyse kendi başlarına bir dildir ve burada belgelenecek çok fazla şey olacaktır! Normal ifade kalıpları hakkında bilgi edinmek için, regular-expressions.info gibi normal ifadeleri belgelemeye adanmış birçok web sitesinden birini ziyaret etmek istersiniz.

Normal ifadeleri kullanarak kayan bir noktayı eşleştirmek için aşağıdaki deseni kullanabiliriz:
^[-+]?[0-9]*\.?[0-9]+$
Düzenli ifade dilini anlamıyorsanız, bu muhtemelen rastgele bir sembol kümesi gibi görünecektir ve bunun aslında basit bir düzenli ifade örneği olduğunu söylediğimde bana inanın! Neyse ki, şimdilik modelin doğru olduğuna ve bunu STRREGEX'te kullanabileceğimize güvenebilirsiniz.

Yukarıdaki işlev aşağıdaki şekilde değiştirilebilir:
[FUNCTION f_fpmatch]
IF (STRREGEX(^[-+]?[0-9]*\.?[0-9]+$, <ARGS>))
    SERV.LOG <ARGS> is a floating point number.
ELSE
    SERV.LOG <ARGS> is NOT a floating point number.
ENDIF
Göründüğü kadar karmaşık, işi iyi yapıyor. Örneğin, "1,5", "-250,002", "50" ve hatta ",007" gibi değerlerle eşleşir![/abcdef]

UO-Dev SPONSOR

Paylaş

XFacebook

Önceki / Sonraki

Faydalı mı?

Bu içerik size yardımcı oldu mu?

UO-Dev SPONSOR

Henüz yorum yapılmamış. Yorum yazabilmek için giriş yapmanız gerekir.

Üyelerin oylama ortalaması (10 dışında) :

Henüz Oylanmamış

Oylar: 0

Paylaş

XFacebook

Önceki / Sonraki

Faydalı mı?

Bu içerik size yardımcı oldu mu?