Perl的新功能,大括号/语法问题

时间:2011-09-03 13:11:23

标签: perl syntax syntax-error

我最近开始使用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 个答案:

答案 0 :(得分:9)

这没有任何意义:

        ...

        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.

答案 1 :(得分:8)

除了使用==和!=(它们是数字比较运算符)而不是eq和ne进行字符串比较的错误之外,在while测试之后你缺少一个分号。也就是说,你有

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

请注意,Perl与C一样,支持两种形式

while (expr) { stuff }

do { stuff } while (expr)

我想你打算使用后一种形式。

如果上面说明第238行的错误,那么当你纠正它时,第247行的错误可能会消失,如果它以某种方式导致其他方面的悬空;但是如果没有编译代码,我就不太清楚了。