(→Notes & quirks) |
|||
Line 1: | Line 1: | ||
− | The '''$*''' allows you to | + | The '''$*''' allows you to iterate over all of the tokens contained within $1-. The way this works is much like a while loop. $* has been omitted from the help file for a while now, after while loops were introduced, and is therefore no longer documented. |
− | $* is extremely powerful because is | + | $* is extremely powerful, because it is much faster than using a while loop on a list of tokens. Understanding how this works is pretty simple, so consider the following: |
− | <syntaxhighlight lang="mIRC"> | + | <syntaxhighlight lang="mIRC">var %list a b c d,%a 1 |
− | var %list a b c d,%a 1 | ||
while ($gettok(%list,%a,32)) { | while ($gettok(%list,%a,32)) { | ||
echo -a $v1 | echo -a $v1 | ||
inc %a | inc %a | ||
− | } | + | }</syntaxhighlight> |
− | </syntaxhighlight> | + | This can be written as: |
− | + | <syntaxhighlight lang="mIRC">tokenize 32 a b c d | echo -a $*</syntaxhighlight> | |
− | <syntaxhighlight lang="mIRC"> | + | The above is much smaller, and a lot faster. Pretty cool, isn't it? |
− | tokenize 32 a b c d | echo -a $* | ||
− | </syntaxhighlight> | ||
− | |||
== Notes & quirks == | == Notes & quirks == | ||
+ | Why was the $* identifier removed from the help file in the first place? Well, $* was removed because it does not really work the same way that the other identifiers do, and because it is quirky. | ||
− | + | Quirky? Quirky, how? | |
+ | |||
+ | Well, mIRC takes the command $*, which appears in and replace all of its occurrences in the line by a special marker: `~$*: You can see that by doing for example: | ||
+ | |||
+ | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $left($*,1) $+ $chr(3) $+ $mid($*,2)</syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
Let's take a look at this: | Let's take a look at this: | ||
− | <syntaxhighlight lang="mIRC"> | + | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | echo -a $mid($*,2)</syntaxhighlight> |
− | //tokenize 32 abcd | echo -a $mid($*,2) | + | |
− | </syntaxhighlight> | + | Why isn't this returning bcd? Because of the usage of the special marker `~$*, mIRC has stored that the command is actually "echo -a $mid(`~$*,2)". |
− | + | Therefore, for each token, (here only $1 == abcd), evaluate the line first, here $mid(`~$*,2) is ~$*, and then mIRC replaces the marker by the token and executes the echo command. However, after an operation, like $mid here, that marker cannot be found; so, basically it cannot be guaranteed to get the correct value of $* inside an identifier. | |
− | + | There is a workaround for the above issue, and that workaround is by using scid and scon: | |
+ | <syntaxhighlight lang="mIRC">//tokenize 32 abcd | scon -r echo -a $!mid( $* ,2)</syntaxhighlight> | ||
− | + | mIRC replaces $* by the marker, but scon has an extra evaluation system which fits perfectly. The $* mechanism is enabled on scon, and mIRC stores the command of the $* as "scon -r echo -a $!mid( `~$* ,2)" | |
− | |||
− | |||
− | |||
− | + | Beyond that, mIRC evaluates the line for each token, which then becomes: "scon -r echo -a $mid( abcd ,2)", and finally the scon command is executed, resulting in the expected value being echoed. | |
− | + | Another issue is that you cannot call $* more than once in the same scope; the command will simply be skipped. However, this can also be circumvented/worked-around :) | |
− | + | Simply retokenize after using $*, which forces the update of $1-, $* can be used again, but only if the number of tokens passed is higher than the previous number of tokens passed. $* will only start from the previous number of tokens + 1: | |
− | + | <syntaxhighlight lang="mIRC">//tokenize 32 1 2 3 | echo -a $* | tokenize 32 4 5 6 7 8 | echo -a $* | echo -a here</syntaxhighlight> | |
− | <syntaxhighlight lang="mIRC"> | ||
− | //tokenize 32 1 2 3 | echo -a $* | tokenize 32 4 5 6 7 8 | echo -a $* | echo -a here | ||
− | </syntaxhighlight> | ||
− | + | The first three tokens of the second tokenize, "4 5 6", are dummy tokens which are passed to fill in the gap. $1- can be used in front of the next tokenize command in order to start from those new tokens, much like a normal situation. |
Revision as of 18:34, 3 September 2015
The $* allows you to iterate over all of the tokens contained within $1-. The way this works is much like a while loop. $* has been omitted from the help file for a while now, after while loops were introduced, and is therefore no longer documented.
$* is extremely powerful, because it is much faster than using a while loop on a list of tokens. Understanding how this works is pretty simple, so consider the following:
var %list a b c d,%a 1 while ($gettok(%list,%a,32)) { echo -a $v1 inc %a }
This can be written as:
tokenize 32 a b c d | echo -a $*
The above is much smaller, and a lot faster. Pretty cool, isn't it?
Notes & quirks
Why was the $* identifier removed from the help file in the first place? Well, $* was removed because it does not really work the same way that the other identifiers do, and because it is quirky.
Quirky? Quirky, how?
Well, mIRC takes the command $*, which appears in and replace all of its occurrences in the line by a special marker: `~$*: You can see that by doing for example:
//tokenize 32 abcd | echo -a $left($*,1) $+ $chr(3) $+ $mid($*,2)
Let's take a look at this:
//tokenize 32 abcd | echo -a $mid($*,2)
Why isn't this returning bcd? Because of the usage of the special marker `~$*, mIRC has stored that the command is actually "echo -a $mid(`~$*,2)".
Therefore, for each token, (here only $1 == abcd), evaluate the line first, here $mid(`~$*,2) is ~$*, and then mIRC replaces the marker by the token and executes the echo command. However, after an operation, like $mid here, that marker cannot be found; so, basically it cannot be guaranteed to get the correct value of $* inside an identifier.
There is a workaround for the above issue, and that workaround is by using scid and scon:
//tokenize 32 abcd | scon -r echo -a $!mid( $* ,2)
mIRC replaces $* by the marker, but scon has an extra evaluation system which fits perfectly. The $* mechanism is enabled on scon, and mIRC stores the command of the $* as "scon -r echo -a $!mid( `~$* ,2)"
Beyond that, mIRC evaluates the line for each token, which then becomes: "scon -r echo -a $mid( abcd ,2)", and finally the scon command is executed, resulting in the expected value being echoed.
Another issue is that you cannot call $* more than once in the same scope; the command will simply be skipped. However, this can also be circumvented/worked-around :)
Simply retokenize after using $*, which forces the update of $1-, $* can be used again, but only if the number of tokens passed is higher than the previous number of tokens passed. $* will only start from the previous number of tokens + 1:
//tokenize 32 1 2 3 | echo -a $* | tokenize 32 4 5 6 7 8 | echo -a $* | echo -a here
The first three tokens of the second tokenize, "4 5 6", are dummy tokens which are passed to fill in the gap. $1- can be used in front of the next tokenize command in order to start from those new tokens, much like a normal situation.