Новое в Perl, проблемы с фигурными скобками / синтаксисом - PullRequest
1 голос
/ 03 сентября 2011

Я недавно начал программировать на Perl (я пропущу длинную историю), но наткнулся на несколько ошибок, которые я не могу понять:

syntax error at /usr/sbin/test.pl line 238, near ") {"
syntax error at /usr/sbin/test.pl line 247, near "} else"
syntax error at /usr/sbin/test.pl line 258, near ") {"
syntax error at /usr/sbin/test.pl line 276, near ") {"
syntax error at /usr/sbin/test.pl line 304, near "}"
syntax error at /usr/sbin/test.pl line 308, near "}"
syntax error at /usr/sbin/test.pl line 323, near "}"

похоже, что-то связано с скобками, окружающими if и else

У меня есть опыт работы с C, C #, Java, PHP, Lua и другими, поэтому я немного стесняюсь зацикливаться на синтаксических ошибках ..

Я вставил образец кода, который генерирует синтаксическую ошибку:

            if (substr(ToString($buffer),0,4) == 'HELO') {
                $contype = 'smtp';

                send($client,'250 Welcome',0);

            } elsif (substr(ToString($buffer),0,4) == 'EHLO') { 
                $contype = 'esmtp';

                send($client,'250-$hostname Welcome',0);
                send($client,'250 SIZE $msgmaxsize',0);
            }

            do {
                recv($client,$buffer,1024,0);

            } while (ToString($buffer) != 'QUIT') {

                if (substr(ToString($buffer),0,10) == 'MAIL FROM:')
                {
                    $sender = ToString($buffer);
                    $sender =~ m/<(.*?)>/;

                    send($client,'250 OK',0);

                } else {
                    send($client,'503 I was expecting MAIL FROM',0);
                    send($client,'221 Bye',0);
                    break;
                } 

}

к сожалению, я не могу показать всю программу.

Версия Perl 5.10.1

Ответы [ 2 ]

9 голосов
/ 03 сентября 2011

Это не имеет смысла:

        ...

        do {
            recv($client,$buffer,1024,0);

        } while (ToString($buffer) != 'QUIT') {

            if (substr(ToString($buffer),0,10) == 'MAIL FROM:')

        ...

Вы комбинируете модификатор оператора (do {..} while...; с циклом while () {}. Это либо., Либо.

Так напишите что-то вроде:

        ...

        while ( recv($client,$buffer,1024,0) ) {

            last if ToString($buffer) eq 'QUIT';

            if (substr(ToString($buffer),0,10) eq 'MAIL FROM:') {

                ...

            }

        }
etc.
8 голосов
/ 03 сентября 2011

Помимо ошибки использования == и! = (Которые являются операторами сравнения чисел) вместо eq и ne для сравнения строк, вы пропускаете точку с запятой после теста while. То есть у вас есть

do { ...; } while (...) { if (...) { ... } else {...}}

Обратите внимание, что Perl, как и C, поддерживает обе формы

while (expr) { stuff }

и

do { stuff } while (expr)

и я полагаю, вы хотели использовать последнюю форму.

Если вышеприведенное объясняет ошибку в строке 238, то возможно, что ошибка в строке 247 может исчезнуть, когда вы исправите ее, если она каким-либо образом приведет к зависанию; но без компиляции кода я не совсем понимаю, как.

...