Mirc脚本在客户列表中找到完全匹配

时间:2018-04-29 13:53:49

标签: mirc

我用它在文本文件中查找客户名称。名称分别在一行中。我需要找到确切的名字。如果专门搜索尼克,它应该只找到尼克,但即使只有尼克尔森在列表中,我的代码也会说。

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 }
}

2 个答案:

答案 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] *。