我想使用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)这样的东西可行。它没有。
答案 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的“给定时”构造!这是要走的路!