MIRC 脚本/进阶/循环
第 3 章:分支和循环
← 入门 | mIRC 脚本 | 定时器 → |
从零开始:熟悉 mIRC | 入门
学习技巧:分支和循环 | 定时器 | 用户等级 | 文本匹配 | 文件处理 | 哈希表 | 对话框
高级主题:自定义窗口 | 代理 | 套接字
计划:DLL | COM 对象 | 错误检查和处理
循环和分支是 mIRC 脚本中更为基础的部分,几乎你编写的每个脚本都会用到它们。它们有助于控制脚本的流程并告诉它该做什么。可以把它们想象成博物馆里的导游,或者工厂里的监工。导游就像 if 语句,监工就像 while 循环。还有一种第三种语句,使用名为/goto的命令,它可以充当这两种语句中的任何一种。
你将使用if, elseif和else比本节中的其他任何语句都多。如果没有这些命令来告诉脚本去哪里以及做什么,你的脚本每次都会沿着一条线性的路径运行到最后。If 语句也可以用于错误检查,以确保脚本运行所需的正确条件存在。
On *:Text:!*:#:{
if ($1 == !1) { msg $chan You picked the number 1, $nick $+ ! }
elseif ($1 == !2) { msg $chan You picked the number 2, $nick $+ ! }
else { msg $chan Your number was not 1 or 2, $nick $+ . }
}
|
这是一个使用 if 语句进行分支的远程脚本示例。第一个语句检查$1是否等于!1。如果是,它将向频道发送消息并停止。如果不是,它将继续执行下一个语句,即elseif。此语句仅在if语句失败时激活。它检查是否$1是否等于!2。如果是,它将向频道发送消息。否则,它将移动到最后的方案,即else语句。这将向频道发送消息,告知数字不是 1 或 2。
On *:Text:!*:#:{
if ($2) {
if ($2 == 1) { msg $chan You picked the number 1, $nick $+ ! }
elseif ($2 == !2) { msg $chan You picked the number 2, $nick $+ ! }
else { msg $chan Your number was not 1 or 2, $nick $+ . }
return
}
else { msg $chan You need to say ! and then a number. }
}
|
此脚本演示了三件重要的事情。第一件事是检查错误的能力。第一个 if 语句检查是否存在两个参数。第二个演示的是嵌套的 if 语句。这次的 if/elseif/else 嵌套在第一个 If 语句中。这些语句仅在包含它们的 If 为真时才会执行。然后,它们像往常一样执行。最后演示的是/return命令,稍后将在下面简要介绍。如果第一个 if 语句为真,它将停止脚本以防止错误出现。
如果语句可以在命令行中使用,前提是使用双前缀 (//).
//if (1 = 1) { echo -a True! }
|
这将评估 if 语句并在括号内的命令执行。请注意,您需要使用管道在命令行上执行多个命令。
//if (1 = 1) { echo -a True! | echo -a 1 does equal 1! }
|
在 if-then-else 语句、$iif 标识符或 while 循环中,可以使用!前缀表示非。例如,if ($1 != 1)表示"如果 $1 不等于 1。"
$v1和$v2是标识符,它们返回 if-then-else、$iif 或 while 命令中的第一个和第二个条件。在语句if (5 == 3), $v1中,5和$v2将等于3.
$iif是 ifif命令的标识符版本。标识符的语法为
$iif(c1 operator c2,true,false)
|
c1, c2和运算符与 ifif语句中的含义相同。c1和c2是语句检查的条件,而运算符是条件比较的对象。
//echo -a $iif($?="Pick a number" == $?="Pick another number",$true,$false)
|
在命令行中输入该命令。系统将提示您输入两个数字。如果输入的数字相等,则该命令将$true回显到您的屏幕上。否则,该命令将$false回显到您的屏幕上。
还记得我之前做的工厂监工的比喻吗?好吧,这就是它如何应用的。While 循环只是重复执行一组命令,直到提供的条件不再为真。可以把它想象成一个重复的 if 语句。
while (conditions) {
commands
}
|
这是 while 循环的语法。注意它看起来很像 if 语句?这里的区别在于 while 循环会重复执行,直到条件为假。
On *:Text:!channels:#:{
var %chan = 1
while (%chan <= $chan(0)) {
var %chans = %chans $chan(%chan)
inc %chan
}
msg $chan I am on %chans $+ , $nick $+ .
}
|
此循环的功能是允许某人在频道中输入!channels,然后你将报告你所在的频道。工厂监工是工作环境中某人告诉工人完成一项工作直到他们下班的隐喻。While 循环是工人,执行其“任务”,直到条件不再为真。在本例中,当变量%chan小于或等于你所在的频道数 ($chan(0)) 时,它将频道名称添加到变量%chans中,然后增加%chan。一旦%chan大于$chan(0),它将停止并继续执行下一条命令。
On *:Text:!channels:#:{
var %chan = 1
while (%chan <= $chan(0)) {
var %chans = %chans $chan(%chan)
}
msg $chan I am on %chans $+ , $nick $+ .
}
|
不要犯忘记在 while 循环中增加变量的错误。如果你没有让 while 循环能够变为假,它将永远运行下去,并锁定 mIRC,直到你按下Ctrl+Break来停止它。
Goto 是一个不太常用的命令,但它很有用,可以充当 if 语句或 while 循环。
/goto point
...
:point
commands
|
这基本上是如何/goto工作的。你在脚本中的某一行设置一个:point,然后在脚本中的其他地方,你使用goto point跳到 point 后面的那一行。例如
On *:Text:!number*:#:{
if ($2 == 1) { goto 1 }
if ($2 == 2) { goto 2 }
if ($2 == 3) { goto 3 }
else { goto huh }
:1
msg $chan You picked 1!
return
:2
msg $chan You picked 2!
return
:3
msg $chan You picked 3!
return
:huh
msg $chan What number is that $+($nick,?)
}
|
在此示例中,脚本将确定你选择了哪个数字并告诉你它是什么。如果你选择了不是 1、2 或 3 的内容,脚本将告诉你。注意 goto 在此脚本中的作用。根据你的选择,它将跳转到脚本中的某个特定位置。
alias who_ops {
var %op = 1
:start
if ($nick($chan,%op) isop $chan) { echo -a $v1 }
inc %op
if (%op <= $nick($chan,0)) {
goto start
}
}
|
这次,/goto语句不控制脚本的分支,而是导致它循环,直到满足某个条件。使用goto还是ifif或while
循环中使用了四个特殊命令;/halt, /break, /continue和/return. /break和/continue是特定于循环的,但是/halt和/return具有涉及停止当前正在执行的脚本或例程的特殊用途。