Tcl 'неправильно # аргументы: дополнительные слова после предложения "else" в команде "if" - PullRequest
0 голосов
/ 18 октября 2018

Я искал похожие темы, связанные с этой ошибкой, связанной с использованием «elseif», и дважды проверил, чтобы убедиться, что я не делаю те же ошибки, которые были ранее опубликованы или обсуждены.Основываясь на моих исследованиях, я считаю, что этот код является точным и правильно отформатирован.Может ли быть проблема с версией, и, возможно, у моей компании нет правильных библиотек, или я действительно испортил синтаксис?

Ошибка, которую я получаю:

[0:TEST] Tcl error:
    msgId   = message0
    proc    = 'X_EPIC_UROLOGY_OBR_xlate'
    args    = ''
    result  = 'wrong # args: extra words after "else" clause in "if" command'
    errorInfo: '
wrong # args: extra words after "else" clause in "if" command
    while executing
"if { [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $att_prov] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $a..."
invoked from within
"if [cequal $segtype PV1] {

                  set fieldList [split $seg $field_sep]

                  if { [regexp {1184684789|189175..."
    (procedure "X_EPIC_UROLOGY_OBR_xlate" line 166)
    invoked from within
"X_EPIC_UROLOGY_OBR_xlate {MSGID message0} {CONTEXT sms_ib_data} {ARGS {}} {MODE run} {VERSION 3.0}"'

Мой код:

              if [cequal $segtype PV1] {

              set fieldList [split $seg $field_sep]

                 if { [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $att_prov] == 1} {
                  set fieldList [lreplace $fieldList 7 7 $att_prov]
                 } elseif {
                [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $ord_prov_obr] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $ord_prov_obr] 
                 } elseif {
                [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $cc_prov] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $cc_prov] 
                 } elseif {
                [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $ord_prov_orc] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $ord_prov_orc]
                 } elseif {
                [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $ref_prov] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $ref_prov]
                 }  else {
                [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $cc_prov] == 1} {
                    set fieldList [lreplace $fieldList 7 7 $cc_prov]
                 }
              }

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

У вас есть:

}  else {
  [regexp {1184684789|1891756748|1356301840|1457541278|1275755076} $cc_prov] == 1} {
     set fieldList [lreplace $fieldList 7 7 $cc_prov]
}

Это должно быть elseif.

0 голосов
/ 18 октября 2018

У вас есть ответ на синтаксическую ошибку.Теперь немного обзора кода.

У вас есть много кода для вырезания и вставки.СУХОЙ:

if {[cequal $segtype PV1]} {
#  ^.....................^ remember to brace the expression

    set fieldList [split $seg $field_sep]
    set pattern {1184684789|1891756748|1356301840|1457541278|1275755076}
    foreach word [list $att_prov $ord_prov_obr $cc_prov $ord_prov_orc $ref_prov $cc_prov] {
        if {[regexp $pattern $word]} {
            set fieldList [lreplace $fieldList 7 7 $word]
            break
        }
    }
}

С помощью команды regexp вы подтверждаете, что слово входит в допустимый список слов.Вы не хотите получать ложные срабатывания, например, если $ att_prov равен «118».Я бы взял из этого регулярное выражение и просто протестировал бы членство в списке, которое использует равенство строк

    set allowed {1184684789 1891756748 1356301840 1457541278 1275755076}
    foreach word [list $att_prov $ord_prov_obr $cc_prov $ord_prov_orc $ref_prov $cc_prov] {
        if {$word in $allowed} {
            set fieldList [lreplace $fieldList 7 7 $word]
            break
        }
    }

Помимо выбора имен переменных, которые лучше подходят вашему домену, я думаю, что это более четко выражает ваше намерение.

0 голосов
/ 18 октября 2018

Проблема в вашем последнем "другом".после него у вас есть два «слова».

Вот как это видит tcl:

} else { [regexp ...] == 1} {...}
       ^^^^^^^^^^^^^^^^^^^^ ^^^^^
       word 1               word 2

«Дополнительное слово после оператора else» - это слово 2, часть {...}.После else вам разрешено иметь только одно «слово» (определение слова «слово», а не буквальное слово в tcl).

Если это действительно «другое» (то есть: делатьэто если все остальные условия не выполняются "), вам нужно просто удалить все слова 1. Если это другое условие, вам нужно изменить else на elseif, чтобы оно воспринимало слово 1 как выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...