Training, Open Source computer languages
PerlPHPPythonMySQLApache / TomcatTclRubyJavaC and C++LinuxCSS 
Search for:
Home Accessibility Courses Diary The Mouth Forum Resources Site Map About Us Contact
 
For 2023 (and 2024 ...) - we are now fully retired from IT training.
We have made many, many friends over 25 years of teaching about Python, Tcl, Perl, PHP, Lua, Java, C and C++ - and MySQL, Linux and Solaris/SunOS too. Our training notes are now very much out of date, but due to upward compatability most of our examples remain operational and even relevant ad you are welcome to make us if them "as seen" and at your own risk.

Lisa and I (Graham) now live in what was our training centre in Melksham - happy to meet with former delegates here - but do check ahead before coming round. We are far from inactive - rather, enjoying the times that we are retired but still healthy enough in mind and body to be active!

I am also active in many other area and still look after a lot of web sites - you can find an index ((here))
Help wanted for using "Scan" command

Posted by karthikshenoy (karthikshenoy), 15 June 2003
hi everybody!

i am new to tcl/tk. please help me with this problem. i seem to be getting nowhere  

i am trying to split a string of this format:

word$meaning(s)

example:

abhor$to hate; to detest

i am using the following scan command:

scan $entireline "%[^$]%*[$]%[^$]" word meaning

what i would like is for word and meaning to have the following values:

word = abhor
meaning = to hate; to detest

what is wrong? how do i get what i want?

thanks in advance!

-karthik

Posted by admin (Graham Ellis), 15 June 2003
Hi, Welcome ...

scan is one of those commands that sometimes I wish didn't exist in Tcl - it's been there since the language first started, but things have moved on and there's nearly always a better way to do things.   I've looked at the problem you posed, and if I was writing the code I would use a regular expression  via the regexp command - here's an example:

Code:
set example {abhor$to hate; to detest}
regexp (.*)\\\$(.*) $example all word meaning
puts "The word $word means $meaning"


and when I run that, it says:
The word abhor means to hate; to detest
which is what you're looking for.

Lots of other ways to do the same thing - let me know if you need any more detail for the above, or you would like to look at further alternatives


Posted by karthikshenoy (karthikshenoy), 15 June 2003
Thanks Graham! This works perfectly.

I have kinda understood the (.*)\\\$(.*) regular expression that you have used but I would like to know more about the \\\$ part.

$ is a token which has another meaning so we need to use a delimiter that is \. But I could not understand why we need to use 3 consecutive \ s.

I am still wondering why the scan function refuses to behave the way it claims to. I have tried various combinations of teh format string but i just cannot achieve accurate results with the scan command.

Really appreciate your help. Thanks!!


Posted by admin (Graham Ellis), 15 June 2003
Quote:
I am still wondering why the scan function refuses to behave the way it claims to. I have tried various combinations of teh format string but i just cannot achieve accurate results with the scan command.


Yep ... I've heard that MANY times before. Don't use scan  ... by the way, I've learnt enough of scan to avoid it usually, so I'm not a good person to advise on what's wrong with your string.

New subject - the \\\$.  

Tcl scripts are interpretted by the language interpresster as the script is run, and the $ character is a special to tell the interpretter that a variable name is starting and its contents must be substituted in.   You do NOT want this to happen as your $ really is a $, so you put a \ in front of in to tell the Tcl interpretter that the $ has an alternative meaning - it REALLY IS a $.

But that's not the end of the story.  In a regular expression, a $ also has a special meaning ... but once again you really want a $. Solution?   Include a \ in the regular expression to tell that to the regular expression handler.   To get that \ through the Tcl interpretter, though, you have to preceed it by a \ - thus the third
\ in the regular expression.

Thus ..... in the Tcl source
     \\\$
Which means tha
     \$
is passed to the regular expression handler, so it really looks for
     $








This page is a thread posted to the opentalk forum at www.opentalk.org.uk and archived here for reference. To jump to the archive index please follow this link.

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2024: Well House Manor • 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • FAX: 01144 1225 793803 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho