我用它在文本文件中查找客户名称。名称分别在一行中。我需要找到确切的名字。如果专门搜索尼克,它应该只找到尼克,但即使只有尼克尔森在列表中,我的代码也会说。
On*:text:*!Customer*:#: {
if ($read(system\Customer.txt,$2)) {
.msg $chan $2 Customer found in list! | halt }
else { .msg $chan 4 $2 Customer not found in list. | halt }
}
答案 0 :(得分:0)
您必须遍历每个匹配的行并查看该行是否完全匹配
像这样的东西
On*:text:*!Custodsddmer*:#: {
var %nick
; loop over all lines that contains nick
while ($read(customer.txt, nw, *nick*, $calc($readn + 1))) {
; check if the line is an exact match
if ($v1 == nick) {
%nick = $v1
; stop the loop because a result is found
break;
}
}
if (%nick == $null) {
.msg $chan 4 $2 Customer not found in list.
}
else{
.msg $chan $2 Customer found in list!
}
您可以在此处找到更多信息:https://en.wikichip.org/wiki/mirc/text_files#Iterating_Over_Matches
答案 1 :(得分:0)
如果您要在新的行单独列表中查找完全匹配,则可以使用“w”开关而不使用通配符“*”字符。
来自mIRC文档
$ read(filename,[ntswrp],[matchtext],[N])
扫描文件info.txt,查找以mirc和。开头的行 返回匹配值后面的文本。 // echo $ read(help.txt,w, *帮助*)
因为我们不想要通配符匹配,而是完全匹配,我们会使用:
$read(customers.txt, w, Nick)
完整代码:
ON *:TEXT:!Customer *:#: {
var %foundInTheList = $read(system\Customer.txt, w, $2)
if (%foundInTheList) {
.msg # $2 Customer found in list!
}
else {
.msg 4 # $2 Customer not found in list.
}
}
对原始代码的评论很少
<强>停机强>
halt
只应在您强行要阻止将来进行任何处理时使用。在大多数情况下,您可以通过编写代码流来避免它,在没有明确使用暂停的情况下,它将表现得像那样。
它还将解决可能出现的新问题,以防您想要添加新代码,但您会想知道它为什么不执行...因为现在忘记了halt
命令。
这也将改善您的调试,如果您不知道,它将不会让您想到另一个流出口。
<强>可读性强>
if (..) {
.... }
else { .. }
当考虑第一个{}内的多行代码时,很难注意到else
(或elseif
),因为mIRC远程解析器将与else行放在同一个标识上它上面的行,包含结束}
代码。 在可读性的情况下,你应该几乎总是少量额外的代码,特别是它不需要任何新费用!因为我记得新行是免费的。
因此,请确保在新行中拥有每个命令的重击规则。 (包括结束括号)
匹配文字
On*:text:*!Customer*:#: {
以上代码存在严重问题,而且还有bug。
严重:不起作用,因为在*:文字中on
和*:text
之间没有空格
错误:!客户将匹配EVERYTHING-BEFORE!customerANDAFTER <NICK>
,这显然不是所希望的行为。你想要的是:!Customer *:
只有在第一个单词是!customer时才匹配,你必须输入至少另一个文本,因为我使用了[SPACE] *。