我想从字符串中提取一个值(不断变化)以便进一步处理。
字符串是
TPSM seed 4339CD65 pass 1 x 0 x 1 errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD60 pass 1 x 9 x 2 errors 0 pid 179947 rulefilecycle 0
TPSM seed 2339CD61 pass 1 x 101 x 5 errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD65 pass 1 x 19 x 6 errors 0 pid 179947 rulefilecycle 0
TPSM seed 9339CD65 pass 1 x 100 x 7 errors 0 pid 179947 rulefilecycle 0
我想提取1 x a x n 形式的传递之后的值,其中我感兴趣的是' n' 。 我正在尝试在perl中使用substr(),但由于数字不断变化,我无法写出像 substr($ string,37,1)这样的东西。
如果没有某些正则表达式的substr(),我怎么能实现这个目的?
答案 0 :(得分:5)
怎么样:
my ($n) = $string =~ /pass\s+\d+\s+x\s+\d+\s+x\s+(\d+)/;
<强>解释强>
/ : Regex delimiter
pass : literally pass
\s+\d+\s+ : 1 or more spaces, 1 or more digits, 1 or more spaces (ie. the first number)
x : literally x
\s+\d+\s+ : 1 or more spaces, 1 or more digits, 1 or more spaces (ie. the second number)
x : literally x
\s+ : 1 or more spaces
(\d+) : 1 or more digits, captured in group 1 (ie. the third number)
/ : regex delimiter
如果正则表达式匹配$string
,则在组1中捕获第三个数字,然后使用此组中的值填充变量$n
。
如评论中所述,它可以简化为:
my ($n) = $string =~ /pass(?:\s+\d+\s+x){2}\s+(\d+)/;
(?:...)
是非捕获组。
答案 1 :(得分:0)
你可以试试这个:
while(<DATA>)
{
printf "%s\n", ($_=~m/\s*x\s*(\d+)\s*errors\s0/i)[0];
}
__DATA__
TPSM seed 4339CD65 pass 1 x 0 x 1 errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD60 pass 1 x 9 x 2 errors 0 pid 179947 rulefilecycle 0
TPSM seed 2339CD61 pass 1 x 101 x 5 errors 0 pid 179947 rulefilecycle 0
TPSM seed 5339CD65 pass 1 x 19 x 6 errors 0 pid 179947 rulefilecycle 0
TPSM seed 9339CD65 pass 1 x 100 x 7 errors 0 pid 179947 rulefilecycle 0
答案 2 :(得分:0)
您也可以使用split
:
默认情况下,split
将在/\s+/
上拆分,然后您可以像访问数组一样访问所需的元素:
use warnings;
use strict;
use feature qw / say /;
while(<DATA>){
chomp;
my $num = (split)[8];
say $num;
}