带有perl Switch模块的空白

时间:2014-10-25 13:15:53

标签: perl

以下简短的perl程序运行正常(并且没有做任何事情,如预期的那样):

use Switch;
switch (1) {}

但是,如果我将程序放在一行,如下所示,

use Switch; switch (1) {}

我收到错误

richard@affric:~$ perl foo.pl
syntax error at foo.pl line 1, near ") {"
Execution of foo.pl aborted due to compilation errors.

任何人都可以向我解释这个吗?

(编辑:是的,我知道不推荐使用Switch.pm,是的,我知道代码在换行符时更具可读性。)

1 个答案:

答案 0 :(得分:3)

Switch模块被写为Perl filter,这实际上意味着Switch模块可以在perl解析器获取之前查看并更改源代码。

我相信你在这里看到的只是过滤器中的一个错误。如果你使用后端B::Deparse模块,那么你就有机会看到Switch对你的程序做了什么讨厌的事情。例如,对于您的初始版本

perl -MO=Deparse myswitch.pl

产生

use Switch;

S_W_I_T_C_H: while (1) {
    local $_S_W_I_T_C_H;
    &Switch::switch(1);
}
continue {
    (last);
}

所以你可以看到有足够的误差范围。

如果我不得不猜测我会说Switch只是期望所有开始use Switch的行都包含模块选项而没有别的。如果您使用-M开关来包含模块,就像这样

perl -MO=Deparse -MSwitch -E'switch (1) { }'

然后结果就是这个

use Switch;
S_W_I_T_C_H: while (1) {
    local $_S_W_I_T_C_H;
    &Switch::switch(1);
}
continue {
    last;
}
-e syntax OK

不同之处在于既没有引发编译时间也没有引发运行时错误。


<强>更新

问题似乎是Filter::Util::Call模块的问题,Switch所依据的模块。问题是此模块传递给源过滤器的文本仅在跟随 use Switch语句的行开始。在同一行之后的任何内容都由perl解析器直接处理。

这意味着,在第二种情况下,perl会看到(未修改的)程序switch (1) {}Switch无关,因为在此行之后根本没有代码可以过滤。< / p>

我认为这很可能是perl的固有部分,并且无法在中线拦截源流。但它是一个非关键的错误,现在您知道原因,您应该能够轻松解决它。