为什么我的正则表达式不适用于Perl的Switch模块?

时间:2009-07-25 09:12:30

标签: perl switch-statement

我想使用switch语句。我很快遇到了困难。看起来我不走运。我决定使用if else样式的开关。

我想知道为什么这不起作用。你呢?看起来正则表达式上的/ gc标志存在问题。

use Switch;
while ( pos($file) < length($file) ) {
   switch ($file)
   {

   case  (/\G\s*object\s+(\w+)\s*\:\s*(\w+)/gc)  {
   }
   }
   last if ( $oldpos == pos($file) );
   $oldpos = pos($file);
 } 

有人建议像case(m!\ G \ s object \ s +(\ w +)\ s :\ s *(\ w +)!gc)这样的东西可行。它没有。

3 个答案:

答案 0 :(得分:13)

Switch.pm是使用源过滤器实现的,这可能会导致奇怪的错误,这些错误很难被追踪。由于其不可预测性,我不建议在生产代码中使用Switch。 Switch.pm文档mention也可能无法使用修饰符解析正则表达式。

如果您使用的是Perl 5.10,则可以使用新的内置given/when语法。

use feature 'switch';
given ( $file ) { 
    when ( /\G\s*object\s+(\w+)\s*\:\s*(\w+)/gc ) { 
        ...
    }
}

如果你使用的是5.10之前的版本,最好的办法就是使用if/else结构。

答案 1 :(得分:6)

请查看"Limitations" section of the documentation。建议您使用“m?...?”形式的正则表达式克服一些解析问题。这可能对你有用。

或者,看看关于switch语句的perlsyn(1)部分:

  

切换声明

  Starting from Perl 5.10, you can say

      use feature "switch";

  which enables a switch feature that is closely based on the Perl 6
  proposal.

  The keywords "given" and "when" are analogous to "switch" and "case" in
  other languages, so the code above could be written as

      given($_) {
          when (/^abc/) { $abc = 1; }
          when (/^def/) { $def = 1; }
          when (/^xyz/) { $xyz = 1; }
          default { $nothing = 1; }
      }

答案 2 :(得分:5)

我在网上找到的文档(here)似乎暗示你不能在正则表达式上使用额外的修饰符。

你的代码,没有/ gc,编译并为我跑了..(但没有意义......因为pos不能做你需要的东西!

use warnings;
use strict;

然后提供初始化$ file的第二个样本。

编辑:看看Friedo和Inshalla建议使用Perl 5.10的“给定时”构造!这是要走的路!