Скрипт 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 ответа

Если вы ищете точное совпадение в отдельном списке новой строки, то вы можете использовать переключатель "w" без использования подстановочного знака "*".

Из документации mIRC

$read(имя файла, [ntswrp], [matchtext], [N])

Сканирует файл info.txt для строки, начинающейся со слова mirc, и возвращает текст, следующий за значением совпадения. //echo $read(help.txt, w, *help*)

Поскольку мы не хотим совпадения с подстановочными знаками, но точного соответствия, мы будем использовать:

$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 следует использовать только тогда, когда вы хотите принудительно остановить любую будущую обработку. В большинстве случаев вы можете избежать этого, написав свой поток кода таким образом, что он будет вести себя так, без явного использования halting. Это также решит новые проблемы, которые могут возникнуть, в случае, если вы захотите добавить новый код, но вы будете удивляться, почему он не выполняется.. из-за черта, который сейчас забыт halt команда. Это также улучшит вашу отладку, в том случае, если вы не будете удивляться выходу из другого потока без вашего ведома.

читабельность

if (..) {
.... }
else { .. }

При рассмотрении множества строк кода внутри первого { } будет трудно заметить else (или же elseif) потому что удаленный парсер mIRC будет иметь ту же идентификацию, что и строка else, а также строку над ней, которая содержит закрывающий символ } код. Вы должны почти всегда иметь немного дополнительного кода в случае читабельности, особенно если он ничего нового не стоит! Как я помню, новые строки бесплатны.

Поэтому убедитесь, что у каждой команды в новой строке есть правило удара. (включая закрывающую скобку)

Соответствующий текст

On*:text:*!Customer*:#: {

Приведенный выше код имеет критическую проблему и ошибку.

Критическое: не будет работать, потому что в *: текст не содержит пробелов между on а также *:textОшибка :! Клиент будет соответствовать EVERYTHING-BEFORE!customerANDAFTER <NICK>, что явно не желаемое поведение. Что вы хотите :!Customer *: будет соответствовать, только если первое слово было!customer, и вы должны ввести хотя бы другой текст, потому что я использовал [SPACE]*.

Вы должны пройтись по каждой совпадающей строке и посмотреть, является ли линия точным соответствием

Что-то вроде этого

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

Другие вопросы по тегам