2011-05-06 38 views
1

Perl版本:5.8使用ActivePerl。Perl开关语句中使用Reg表达式的问题

我试图插入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"/> 

回答

4

避免使用Switch.pm;它使用脆弱技术实施。 我相信它在Switch模块内的范围内执行正则表达式,使得$ 1等在您的代码中不可用(在删除不属于那里的$line =~之后)。您的键盘示例缺失use Switch。我也无法让Switch与__DATA__合作。

perldoc -q switch显示了多种方法有一个类似开关的声明,如果你不能使用5.10.1的给定/时的语法,比如:

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"/> 
4

您应该使用givenforeachwhen从5.10或更好,而不是旧的过时Switch.pm模块。

+0

我更新我的职务与Perl版本:V5。 8。谢谢。 – 2011-05-06 01:40:55

+1

@Nano:我想你会从'case'部分删除那些'$ line =〜',因为匹配应该针对你打开的任何东西进行。 – tchrist 2011-05-06 01:46:55

+0

我按照你的指导和测试,但不工作。语法错误。请参阅键盘http://codepad.org/Yur9HGKh – 2011-05-06 02:14:34