有关在Perl switch语句中使用的Reg表达式的问题

时间:2011-05-06 01:36:25

标签: regex perl switch-statement

Perl版本:5.8使用ActivePerl。

我试图将reg表达式作为Perl中switch语句的单独条件插入,但是失败了。

你能告诉我更多关于如何解决的问题吗?

我查阅了每个文档但找不到这样的例子。感谢。

while (my $line =<$fh>) { # change foreach to while
    switch ($line) {
        case ($line =~ m/\<IDCateA\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
        case ($line =~ m/\<IDCateB\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
    }
    my $nextline = <$fh>;
}

这部分数据,

 <IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
 <IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>

2 个答案:

答案 0 :(得分:4)

您应该使用givenforeach与{0}或更好的when,而不是旧的已弃用的Switch.pm模块。

答案 1 :(得分:4)

避免使用Switch.pm;它是使用脆弱技术实现的。 我相信它在Switch模块内的一个范围内执行正则表达式,这样你的代码中就没有$ 1等等(在删除不属于那里的$line =~之后)。

您的键盘示例缺少use Switch。我也很难让Switch与__DATA__合作。

如果您不能使用5.10.1的给定/何时语法,

perldoc -q switch会显示多种方法来获得类似开关的语句,例如:

use strict;
use warnings;

while (my $line = <DATA>) {
    for ($line) {
        if (/<IDCateA\sName="(\w+)"\sid="(\w+)"\s/) {print "  $1 = $2,\n"}
        elsif (/<IDCateB\sName="(\w+)"\sid="(\w+)"\s/) {print "   $1 = $2,\n"}
    }
}

__DATA__
<IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
<IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>