我有一个包含以下行的文件
1.39.2.1 Build 001
1.39.1.2 Build 002
1.39.1.1 Rejected Build
1.39 Succesful Build 004
我试图打印这条线" 1.39 Succesful Build 004" 下面是我的perl脚本
my $file = 'C:\labels.txt';
open(FILE,$file) or die ("Cannot the open the file : $file");
my $ver = "1.39";
my @arr;
foreach (FILE)
{
if($_ =~ m/1.39/)
{
print $line;
}
}
close(FILE);
当我运行此脚本时,它会打印所有行(包括1.39.x.x)。但我想要的线条恰好是1.39。如何搜索它。
感谢任何帮助。
答案 0 :(得分:0)
答案 1 :(得分:0)
我猜你正在尝试匹配构建成功的行。
#!/usr/bin/perl
use strict;
use warnings;
while(<DATA>){
next if $_ =~ /^\s*$/; #skip empty lines
my ($build, @status) = split /\s+/;
print $_ if join(",", @status) =~ /Succesful/;
#you may modify the above regex based on your requirement
#I tried to match line which says build is successful
#See dawg's answer, he matched exact build 1.39
}
__DATA__
1.39.2.1 Build 001
1.39.1.2 Build 002
1.39.1.1 Rejected Build
1.39 Succesful Build 004
答案 2 :(得分:0)
没有人花时间解释为什么你现有的代码不起作用。我认为这是因为你对正则表达式如何运作感到有些困惑。
如果正则表达式模式匹配字符串中的任何位置,则文本字符串将匹配正则表达式。
您的正则表达式为/1.39/
。实际上,那里存在一个小问题,因为点在正则表达式中具有特殊含义(它匹配任何字符),因此要匹配您需要转义的实际点,并且正则表达式变为/1\.39/
。
好的,现在你的正则表达式问问题&#34;这个字符串是否包含子字符串&#34; 1.39&#34;。当然,所有数据行都包含该子字符串。例如,行1.39.2.1 Build 001
包含&#34; 1.39&#34; - 它在一开始就在那里。当然,它之后是其他东西,但正则表达式匹配并不关心它。正则表达式匹配只是询问&#34;这个字符串是否包含这个子字符串?&#34;
所以你需要在你的正则表达式中更精确。你需要匹配&#34; 1.39&#34;就它本身而言,在它之前没有任何东西,只有它之后的空白。这是其他答案的来源。您可以将^
放在正则表达式的开头,以匹配行的开头,并将\s
放在最后,以匹配空格。所以你的正则表达式变成/^1\.39\s/
。