2012-01-06 25 views
0

与Perl和正则表达式有另一个问题,对不起,因为作为一个坏蛋perl noobie ;-)perl匹配正则表达式每行/ g不工作?

我得到的变量$输出通过反引号的整个programm输出。

我正则表达式匹配始终只是在输出中,但不是每一次亮相第一出现..

从Java输出为/ G没有工作,要么..

$output = `$calling 2>>bla.txt`; 

if ($output =~ m/SegmentMean .+ Likelihood: ([-+]?\d+\.?\d+)/g) { 
    print "$1\n"; 
} 

输出:

SegmentMean 0可能性:-7.138117738068088 SegmentMean 1似然:-11.508156736772925 SegmentMean 2似然:-10.424706822552386 SegmentMean 3可能性:-9.56 0308776447586 SegmentMean 4可能性:-9.26826400149502 SegmentMean 5可能性:-9.524685714290996 SegmentMean 6可能性:-8.360030637461975 SegmentMean 7可能性:-8.163275211919945 SegmentMean 8可能性:-7.917569593466525 SegmentMean 9似然:-9.043243571260344

最多SegmentMean 20 ..

回答

4

尝试通过比赛简直像一个数组(和使用更好的正则表达式):

while ($output =~ m/SegmentMean \S+ Likelihood: ([-+]?\d+(\.\d+)?)/g) { 
    print "$1\n"; 
} 

这应该工作。

你甚至可以把它转化为一个单行:

print "$1\n" while ($output =~ /SegmentMean \S+ Likelihood: ([-+]?\d+(?:\.\d+)?)/g); 
+1

我希望它好,我编辑您的文章。我根本不知道Perl,所以我删除了我的答案,并在你的帖子中使用了正则表达式。 +1 :) – 2012-01-06 17:23:36

+0

之前看到您的帖子提姆,是的,它帮助了我!可以很容易,如果你得到正确的点; = – Stefan 2012-01-06 17:27:09

+1

你应该使用while()(m //在标量上下文中)而不是for()(m // g在列表上下文中)。 – tadmc 2012-01-06 18:00:41

1

您只打印第一个匹配项。 $ 1是第一场比赛。