Скрипт Mirc, чтобы найти точное совпадение в списке клиентов - PullRequest
0 голосов
/ 29 апреля 2018

Я использую это, чтобы найти имя клиента в текстовом файле. Имена каждого на отдельной строке. Мне нужно найти точное имя. Если искать Ник специально, он должен найти только Ника, но мой код скажет "найдено", даже если в списке есть только Никольсон.

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 голосов
/ 18 мая 2018

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

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

$ read (имя файла, [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.
  }
}

Несколько замечаний по оригинальному коду

1024 * Приостановление *

halt следует использовать только в том случае, если вы хотите принудительно остановить дальнейшую обработку. В большинстве случаев этого можно избежать, написав поток кода таким образом, что он будет вести себя так, без явного использования halting. Это также решит новые проблемы, которые могут возникнуть, в случае, если вы захотите добавить новый код, но вам будет интересно, почему он не выполняется .. из-за проклятой теперь забытой команды halt. Это также улучшит вашу отладку, в том случае, если вы не будете удивляться выходу из другого потока без вашего ведома.

читаемость

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

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

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

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

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

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

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

0 голосов
/ 29 апреля 2018

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

Примерно так

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

...