如何从perl中的字符串中提取值

时间:2013-08-21 10:37:07

标签: regex perl

以下是我必须在文件中解析的两行和 from first line 我需要提取"180000"第二行需要提取"49 , 59, 54 "

Line 1:
 <Mon Aug  5 15:26:16:040.50 IST 2013> | <MNLOG> <Iteration :  1 Duration : 180000 seconds>

Line2:
 <Mon Aug  5 15:26:16:044.93 IST 2013> | <MNLOG> <TestRunnerUnit - Remaining Time : 49 hours 59 min 54 sec >

我已编写代码,但我看起来很难编码。所以,如果有任何方法可以使用,请告诉我。

我的代码是:

 if($line =~ m/Iteration\s+:\s+1\s+Duration/)
     {
       print"$line\n";
       my @words = split(/ /,$line);
       my $lengh = $#words;
       $Start_Duration = $words[14];
     }

if($line =~ m/Remaining\s+Time\s+:\s+\d+/)
    {
       my @words = split(/ /,$line);
        my $lengh = $#words;
        $Hours= $words[13]*3600;
        $Minuts= $words[15]*60;
        $Seconds= $words[17];
        $Remaining_Time =$Hours+$Minuts+$Seconds;

    }

记录:

====================================================================================================
<Mon Aug  5 15:26:16:040.50 IST 2013> | <MNLOG> <Iteration :  1 Duration : 180000 seconds>


====================================================================================================
<Mon Aug  5 15:26:16:042.11 IST 2013> | <MNLOG> <TestRunnerUnit - Total Weight  : 34>
<Mon Aug  5 15:26:16:042.88 IST 2013> | <MNLOG> <TestRunnerUnit - Total Objects  : 34>

<Mon Aug  5 15:26:16:043.87 IST 2013> | <MNLOG> <TestRunnerUnit - Random Number generated : 3>
<Mon Aug  5 15:26:16:044.40 IST 2013> | <MNLOG> <TestRunnerUnit - Next Test : VideoStreamingSMS_APstress>
<Mon Aug  5 15:26:16:044.93 IST 2013> | <MNLOG> <TestRunnerUnit - Remaining Time : 49 hours 59 min 54 sec >
<Mon Aug  5 15:26:16:045.64 IST 2013> | <DBLOG> <TestRunnerUnit - Test Suite       : concurrency_tests>
<Mon Aug  5 15:26:16:046.26 IST 2013> | <DBLOG> <TestRunnerUnit - Running the test : VideoStreamingSMS_APstress>
<Mon Aug  5 15:26:16:046.81 IST 2013> | <DBLOG> <TestRunnerUnit - Timeout for the test : 1500>
<Mon Aug  5 15:26:16:050.04 IST 2013> | <DBLOG> <TestRunnerUnit - Parameters       : 1>
<Mon Aug  5 15:30:39:760.21 IST 2013> | <MNLOG> <TestRunnerUnit - Random Number generated : 13>
<Mon Aug  5 15:30:39:760.69 IST 2013> | <MNLOG> <TestRunnerUnit - Next Test : CamcorderNoUsb_APstress>
<Mon Aug  5 15:30:39:761.01 IST 2013> | <MNLOG> <TestRunnerUnit - Remaining Time : 49 hours 55 min 31 sec >
<Mon Aug  5 15:30:39:761.28 IST 2013> | <DBLOG> <TestRunnerUnit - Test Suite       : nousb_tests>
<Mon Aug  5 15:30:39:761.54 IST 2013> | <DBLOG> <TestRunnerUnit - Running the test : CamcorderNoUsb_APstress>
<Mon Aug  5 15:30:39:761.77 IST 2013> | <DBLOG> <TestRunnerUnit - Timeout for the test : 1500>
<Mon Aug  5 15:30:39:762.01 IST 2013> | <DBLOG> <TestRunnerUnit - Parameters       : 1>
<Mon Aug  5 15:30:40:017.74 IST 2013> | <MNLOG> <TestRunnerUnit - Test Case : CamcorderNoUsb_APstress>
<Mon Aug  5 15:30:40:018.47 IST 2013> | <DBLOG> <TestRunnerUnit - uses spiderboard: 0>
<Mon Aug  5 15:32:34:136.59 IST 2013> | <MNLOG> <TestRunnerUnit - Random Number generated : 13>
<Mon Aug  5 15:32:34:137.16 IST 2013> | <MNLOG> <TestRunnerUnit - Next Test : WallpaperToggle_APstress>
<Mon Aug  5 15:32:34:137.60 IST 2013> | <MNLOG> <TestRunnerUnit - Remaining Time : 49 hours 53 min 36 sec >
<Mon Aug  5 15:32:34:137.92 IST 2013> | <DBLOG> <TestRunnerUnit - Test Suite       : feature_tests>
<Mon Aug  5 15:32:34:138.15 IST 2013> | <DBLOG> <TestRunnerUnit - Running the test : WallpaperToggle_APstress>
<Mon Aug  5 15:32:34:138.38 IST 2013> | <DBLOG> <TestRunnerUnit - Timeout for the test : 1500>
<Mon Aug  5 15:32:34:138.61 IST 2013> | <DBLOG> <TestRunnerUnit - Parameters       : 3>
<Mon Aug  5 15:32:34:392.25 IST 2013> | <MNLOG> <TestRunnerUnit - Test Case : WallpaperToggle_APstress>
<Mon Aug  5 15:32:34:392.97 IST 2013> | <DBLOG> <TestRunnerUnit - uses spiderboard: 0>

<Mon Aug  5 15:32:36:395.53 IST 2013> | <MNLOG> <Installation - Waking the Device up and Unlocking it>
<Mon Aug  5 15:32:36:396.17 IST 2013> | <DBLOG> <KeyMap_APstress - ADB keyevent : 6>
<Mon Aug  5 15:33:36:407.53 IST 2013> | <DBLOG> <APStress_Command - Timeout on command: adb shell input keyevent 6>

1 个答案:

答案 0 :(得分:2)

这个程序可以帮到你。如果没有看到完整的文件,就无法确定需要对行进行多少验证,因此您可能需要更复杂的正则表达式来检查是否正在处理正确的行。

在变量名中使用大写字母是可疑的做法,因为它们通常保留给Perl代码中的常量,如包名。

use strict;
use warnings;
use feature 'say';

my $start_duration;
my ($hours, $minutes, $seconds);
while (<DATA>) {
  if (/Duration\s*:\s*(\d+)\s*seconds/) {
    $start_duration = $1;
  }
  elsif (/Remaining Time\s*:\s*([^>]+)/) {
    ($hours, $minutes, $seconds) = $1 =~ /\d+/g;
  }
}

say $start_duration;
say join ', ', $hours, $minutes, $seconds;


__DATA__
<Mon Aug  5 15:26:16:040.50 IST 2013> | <MNLOG> <Iteration :  1 Duration : 180000 seconds>
<Mon Aug  5 15:26:16:044.93 IST 2013> | <MNLOG> <TestRunnerUnit - Remaining Time : 49 hours 59 min 54 sec >

<强>输出

180000
49, 59, 54