egghelp.org community Forum Index
[ egghelp.org home | forum home ]
egghelp.org community
Discussion of eggdrop bots, shell accounts and tcl scripts.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Logic Error - Replacing Characters in a String

 
Post new topic   Reply to topic    egghelp.org community Forum Index -> Scripting Help
View previous topic :: View next topic  
Author Message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Mon Nov 05, 2007 8:33 pm    Post subject: Logic Error - Replacing Characters in a String Reply with quote

Code:
bind pub - "+cumulan"  spidey:cumulan

#  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
# aym mi korao hra ku zu gli ti gura bu upa yai gia tu kan guum yipa rur lia do zor qi wu omyr kil airu
proc spidey:cumulan { nick host hand chan text } {
   if { [lindex [split $text] 0] == "-r" } {
      
   } else {
      set i 0
      set output ""
      foreach item [string range $text 0 end] {
         set newchar [string map { "a" "aym" } [string index $text $i]]
         set newchar [string map { "b" "mi" } [string index $text $i]]
         set newchar [string map { "c" "korao" } [string index $text $i]]
         set newchar [string map { "d" "hra" } [string index $text $i]]
         set newchar [string map { "e" "ku" } [string index $text $i]]
         set newchar [string map { "f" "zu" } [string index $text $i]]
         set newchar [string map { "g" "gli" } [string index $text $i]]
         set newchar [string map { "h" "ti" } [string index $text $i]]
         set newchar [string map { "i" "gura" } [string index $text $i]]
         set newchar [string map { "j" "bu" } [string index $text $i]]
         set newchar [string map { "k" "upa" } [string index $text $i]]
         set newchar [string map { "l" "yai" } [string index $text $i]]
         set newchar [string map { "m" "gia" } [string index $text $i]]
         set newchar [string map { "n" "tu" } [string index $text $i]]
         set newchar [string map { "o" "kan" } [string index $text $i]]
         set newchar [string map { "p" "guum" } [string index $text $i]]
         set newchar [string map { "q" "yipa" } [string index $text $i]]
         set newchar [string map { "r" "rur" } [string index $text $i]]
         set newchar [string map { "s" "lia" } [string index $text $i]]
         set newchar [string map { "t" "do" } [string index $text $i]]
         set newchar [string map { "u" "zor" } [string index $text $i]]
         set newchar [string map { "v" "qi" } [string index $text $i]]
         set newchar [string map { "w" "wu" } [string index $text $i]]
         set newchar [string map { "x" "omyr" } [string index $text $i]]
         set newchar [string map { "y" "kil" } [string index $text $i]]
         set newchar [string map { "z" "airu" } [string index $text $i]]
         set output "$output$newchar"
         incr i
      }
   }
   putserv "NOTICE $nick :$text = $output"
}


What I'm trying to do here, is make it replace each letter with several other letters, creating a fake, code language.
But all it does is just delete some chars and only keeping the first several/one char in there. I dunno what's happening, so I came to the forums as a last result. Any help on this would be greatly appreciated!
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Nov 06, 2007 5:43 am    Post subject: Reply with quote

First off, foreach expects a list, not a string. Big difference!

Secondly, why do you use the foreach-loop there anyway? You never try to use $item anywhere within the loop. Don't use foreach as a normal for-loop, but use "for" for this (or "while").

Third, all you seem to do is alot of string map's, why not simply create one large map-list, and allow "string map" to work on the whole string at once?

Such as something like this...
Code:
...
 puthelp "NOTICE $nick :$text = [string map [list a aym b mi c korao d hra e ku ...] $text]"
...


Fourth, the only string map that will have any effect in the end of your code is the last (string map { "z" "airu" }), as the output stored in $newchar from previous string map's will be overwritten by this...
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Tue Nov 06, 2007 8:18 am    Post subject: Reply with quote

Woo, that was great help. I didn't know you could use string map with a list like that. Anyways, I tried it, and it works fine, until it stops replacing characters after the fifth time. I mean, +cumulan abcde works, but beyond that, it'll only replace upto e and then start outputting the following chars without replacing them.

[02:12:35 PM] <Spidey> +cumulan abcdefghijklmnopqrstuvwxyz
[02:12:38 PM] [Notice] -Venom- abcdefghijklmnopqrstuvwxyz = aymmikoraohrakufghijklmnopqrstuvwxyz
[02:17:49 PM] <Spidey> +cumulan this is a test
[02:17:52 PM] [Notice] -Venom- this is a test = this is aym tkust

Code:
bind msg - "+cumulan"  spidey:cumulan

#  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
# aym mi korao hra ku zu gli ti gura bu upa yai gia tu kan guum yipa rur lia do zor qi wu omyr kil airu
proc spidey:cumulan { nick host hand text } {
   if { [lindex [split $text] 0] == "-r" } {
      
   } else {
      set output [string map [list a aym b mi c korao d hra e ku f zu g gli h ti i gura j bu k upa l yai m gia n tu o kan p guum q yipa r rur s lia t do u zor v qi w wu x omyr y kil z airu] $text]
   }
   putserv "NOTICE $nick :$text = $output"
}
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Nov 06, 2007 10:12 am    Post subject: Reply with quote

That's usually an indication that your list is not properly ordered.

One more intuitive way of creating the substitution-list is by doing it something like this:
Code:
set substitute(a) aym
set substitute(b) mi
set substitute(c) korao
...

...[string map [array get ::substitute] $text]...


Also, the list you provided in your post works just fine for me, double-check that you don't have any unexpected spaces or characters within your list (somewhere between "ku" and "f", as it seems this is the location where your list seems to be "offset'd")

edit:
Clumsy me, should've learned to know when to use $ and not by now :p
_________________
NML_375, idling at #eggdrop@IrcNET


Last edited by nml375 on Tue Nov 06, 2007 10:33 am; edited 1 time in total
Back to top
View user's profile Send private message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Tue Nov 06, 2007 10:30 am    Post subject: Reply with quote

Well, it says it can't read the variable cause it's an array:
(cumulan = substitute)
[16:26] Tcl error [spidey:cumulan]: can't read "::cumulan": variable is array

This is after I used global to make it accessible. Without using global, it says it doesn't exist, and without referring to it as global (::), it gives the same error as the one above D:

Thanks again for the help, btw.
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Nov 06, 2007 10:32 am    Post subject: Reply with quote

Ahh... my bad, should've been ::substitute rather than $::substitute

Updating my previous post aswell..
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Tue Nov 06, 2007 10:38 am    Post subject: Reply with quote

Alright! Works like a charm Very Happy
Thanks again ^_^
Just shows I still have alot to learn Razz
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Nov 06, 2007 10:57 am    Post subject: Reply with quote

Np, to see what further you can do using the "string" command, and others, have a look at the manual
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Tue Nov 06, 2007 11:14 am    Post subject: Reply with quote

Alright, thanks :3
Unfortunately, I have another problem D:
Code:
bind msg - "+cumulan"  spidey:cumulan

#  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
# aym mi korao hra ku zu gli ti gura bu upa yai gia tu kan guum yipa rur lia do zor qi wu omyr kil airu
proc spidey:cumulan { nick host hand text } {
   global cumulan
   set reverse 0
   set verbose 0
   set chan ""
   set target ""
   if { [lindex [split $text] 0] == "-r" } {
      set reverse 1
   } else {
      set reverse 0
   }
   if { [lindex [split $text] 0] == "-v" } {
      set verbose 1
      set chan [lindex [split $text] 1]
   } else {
      set verbose 0
   }
   if { ([lindex [split $text] 0] == "-rv") || ([lindex [split $text] 0] == "-vr") } {
      set reverse 1
      set verbose 1
      set chan [lindex [split $text] 1]
   }
   if { !$reverse } {
      set cumulan(a) aym
      set cumulan(b) mi
      set cumulan(c) korao
      set cumulan(d) hra
      set cumulan(e) ku
      set cumulan(f) zu
      set cumulan(g) gli
      set cumulan(h) ti
      set cumulan(i) gura
      set cumulan(j) bu
      set cumulan(k) upa
      set cumulan(l) yai
      set cumulan(m) gia
      set cumulan(n) tu
      set cumulan(o) kan
      set cumulan(p) guum
      set cumulan(q) yipa
      set cumulan(r) rur
      set cumulan(s) lia
      set cumulan(t) do
      set cumulan(u) zor
      set cumulan(v) qi
      set cumulan(w) wu
      set cumulan(x) omyr
      set cumulan(y) kil
      set cumulan(z) airu
   } else {
      set cumulan(aym) a
      set cumulan(mi) b
      set cumulan(korao) c
      set cumulan(hra) d
      set cumulan(ku) e
      set cumulan(zu) f
      set cumulan(gli) g
      set cumulan(ti) h
      set cumulan(gura) i
      set cumulan(bu) j
      set cumulan(upa) k
      set cumulan(yai) l
      set cumulan(gia) m
      set cumulan(tu) n
      set cumulan(kan) o
      set cumulan(guum) p
      set cumulan(yipa) q
      set cumulan(rur) r
      set cumulan(lia) s
      set cumulan(do) t
      set cumulan(zor) u
      set cumulan(qi) v
      set cumulan(wu) w
      set cumulan(omyr) x
      set cumulan(kil) y
      set cumulan(airu) z
   }
   set output [string map [array get ::cumulan] $text]
   if { $verbose } {
      set output [lrange [split $output] 2 end]
   } elseif { $reverse } {
      set output [lrange [split $output] 1 end]
   }
   if { $verbose } {
      set method "PRIVMSG"
      set target $chan
   } else {
      set method "NOTICE"
      set target $nick
   }
   if { [catch { putserv "$method $target :$output" } errmsg] } {
      putserv "NOTICE $nick :\002Error:\002 $errmsg"
   }
}

putlog "Cumulan Translator 1.0 by Hen Asraf: Loaded"

I need to code it to work both ways -- translate from one language to another. English to Cumulan works fine, but vice-versa doesn't work D: Any clue?
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
nml375
Revered One


Joined: 04 Aug 2006
Posts: 2857

PostPosted: Tue Nov 06, 2007 11:35 am    Post subject: Reply with quote

First thing, prefixing a variable with :: means addressing it with a full namespace path, in this case the global namespace :: (instead of using global cumulan).

I'd suggest you use two different variables, ::cumulan and ::cumulanreverse, define these in globalspace, and then use something like this:
Code:
if {$reverse} {
 set map ::cumulanreverse
} {
 set map ::cumulan
}
set output [string map [array get $map] $text]


In this case, I use $map intentionally to hold the name of the array with the map, rather than entering the different array-names directly.
_________________
NML_375, idling at #eggdrop@IrcNET
Back to top
View user's profile Send private message
dokueki
Voice


Joined: 28 Apr 2007
Posts: 31
Location: Bat Yam, Israel

PostPosted: Tue Nov 06, 2007 11:41 am    Post subject: Reply with quote

Again, works like a charm, thanks again!
Back to top
View user's profile Send private message Send e-mail Visit poster's website AIM Address MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    egghelp.org community Forum Index -> Scripting Help All times are GMT - 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Forum hosting provided by Reverse.net

Powered by phpBB © 2001, 2005 phpBB Group
subGreen style by ktauber