2011-05-06 55 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