我正在编写一个perl脚本,我有一个简单的正则表达式来捕获数据文件中的一行。该行以IG-XL Version:
开头,后跟数据,因此我的正则表达式匹配该行。
if($row =~/IG-XL Version:\s(.*)\;/)
{
print $1, "\n";
}
让我们说$1
打印9.0.0
。这是我想要的结果。但是,在相同数据文件的另一部分中,还有相同行IG-XL Version:
。 $ 1现在打印出两个数据9.0.0
。
我只希望它匹配第一个,所以我只能获得一个值。我尝试了/IG-XL Version:\s(.*?)\;/
这是建议最多的解决方案,添加了?
,因此它会.*?
,但它仍会输出两个。有什么帮助吗?
编辑:
$row
的值为:
Current IG-XL Version: 8.00.01_uflx (P7); Build: 11.10.12.01.31
Current IG-XL Version: 8.00.01_uflx (P7); Build: 11.10.12.01.31
我想要的值是8.00.01_uflx (P7)
我得到的,但是两次。
答案 0 :(得分:1)
在逐行读取文件时执行此操作的唯一方法是保留一个状态标志,记录您是否已找到该模式。但是,如果您将数据存储在散列中,就像在your previous question中一样,那么它就会重要,因为您只需用相同的值覆盖散列元素
if ( $row =~ /IG-XL Version:\s*([^;]+)/ and not $seen_igxl_vn ) {
print $1, "\n";
$seen_igxl_vn = 1;
}
或者,如果文件相当小,您可以将整个内容读入内存并仅搜索每个项目的第一次出现
我建议您发布一个显示完整程序,输入数据和所需输出的问题,这样我们就可以为您提供完整的解决方案,而不是一点一点地看到您的问题