我正在使用它在文本文件中查找客户名称。名称每个都在单独的行上。我需要找到确切的名称。如果要专门搜索尼克,它应该只找到尼克,但是即使只有尼克森在TE列表中,我的代码也会发现。
On*:text:*!Customer*:#: {
if ($read(systemCustomer.txt,$2)) {
.msg $chan $2 Customer found in list! | halt }
else { .msg $chan 4 $2 Customer not found in list. | halt }
}
您必须循环遍历每条匹配行,并查看该行是否确切匹配
类似这样的东西
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/mirc/text_files#iterating_over_matches
如果您在新的行分开列表中寻找精确匹配,则可以在不使用通配符'*'字符的情况下使用'W'开关。
来自MIRC文档
$ read(文件名,[ntswrp],[matchText],[n](
扫描文件info.txt以获取以mirm和单词开始的行 按照匹配值返回文本。//echo $ read(help.txt,w, *帮助*(
因为我们不希望通配符匹配,但是确切的匹配,我们会使用:
$read(customers.txt, w, Nick)
完成代码:
ON *:TEXT:!Customer *:#: {
var %foundInTheList = $read(systemCustomer.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远程解析器将在其上方的线路上列出与其他行相同的标识,其中包含该行关闭}
代码。您几乎应该总是在可读性的情况下,几乎没有额外的代码,尤其是它花了新的价格!,因为我记得新行是免费的。
因此,请确保在新行中具有每一个命令的重击规则。(包括关闭支架(
匹配文本
On*:text:*!Customer*:#: {
上面的代码有关键问题,并且错误。
批评:无法正常工作,因为在*:文本中没有on
和*:text
之间的空间错误:!customer 将匹配EVERYTHING-BEFORE!customerANDAFTER <NICK>
,这显然不是所需的行为。您想要的是:!Customer *:
仅在第一个单词是!客户时才匹配,并且您必须至少输入另一个文本,因为我使用了[Space]*。