sultano has asked for the wisdom of the Perl Monks concerning the following question:

Dear perl monks; I am new to perl and am currently in need of help; I have a file that I am opening, and I am searching for this line of code:
Thu Oct 18 21:26:36 2007: Time for all triggers in report period (60s): 1.330981s
Thu Oct 18 21:27:36 2007: Time for all triggers in report period (60s): 1.457271s
Thu Oct 18 21:28:36 2007: Time for all triggers in report period (60s): 1.340150s

I do find the lines perfectly fine as you see above...
HOWEVER, what I need and don't know how to do is the following;
If within each of those lines, the (60s) changes to another number, I want to return an error code?;

If it's let's say (300s), exit and return one error code;
if it's let's say (600s), exit and return second error code;

I'd appreciate the help! thanks in advance.

  • Comment on return code for finding a keyword within a line

Replies are listed 'Best First'.
Re: return code for finding a keyword within a line
by FunkyMonk (Bishop) on Oct 19, 2007 at 16:03 UTC
    The following code will exit (with an appropriate error code) on the first line it encounters that has a time in brackets that isn't 60. The error code will be the time it found.
    my @test_data = ( qw/bananas apples oranges/, 'Thu Oct 18 21:26:36 2007: Time for all triggers in report period +(60s): 1.330981s', 'Thu Oct 18 21:27:36 2007: Time for all triggers in report period +(120s): 1.457271s', 'Thu Oct 18 21:28:36 2007: Time for all triggers in report period +(300s): 1.340150s' ); for ( @test_data ) { if ( m/\((\d+)s\)/ && $1 != 60 ) { print "$_\n"; exit $1 } }

Re: return code for finding a keyword within a line
by meraxes (Friar) on Oct 19, 2007 at 14:58 UTC

    Please show a little of your code so far!

    What do you mean by exit with an error code? die? exit? You may want to log it as opposed to ending the program so you can document all instances of the problem.

    What are you using to detect the lines that you ARE finding right now? It shouldn't be too hard to modify it but you need to show what you've done thus far.

    --
    meraxes
Re: return code for finding a keyword within a line
by eff_i_g (Curate) on Oct 19, 2007 at 15:11 UTC
    Something like this?
    my $str = 'Thu Oct 18 21:26:36 2007: Time for all triggers in report p +eriod (60s): 1.330981s'; my ($ret_val) = $str =~ /(?<=period )\((\d+)s\):/; exit $ret_val;
Re: return code for finding a keyword within a line
by perlofwisdom (Pilgrim) on Oct 19, 2007 at 19:34 UTC
    The secret is in capturing the value between the parentheses. Your message always has the same basic string "Time for all triggers in report period (?s)". You can capture the value you want by putting parentheses in your regular expression around those values. Since your value is digits, use \d+. The '+' quantifier matches 1 or more of the previous character (in this case \d, or a digit). So, it will match one or more digits.

    Remember to escape any parentheses that are in in the string you are searching. For example: $msg =~ /report period \((\d+)/

    When you do this, the value is store in a built-in variable ${1} for the first set of parentheses, ${2} for the second set, etc.

    For example:

    my @msgs = ("Thu Oct 18 21:26:36 2007: Time for all triggers in rep +ort period (300s): 1.330981s", "Thu Oct 18 21:27:36 2007: Time for all triggers in r +eport period (600s): 1.457271s", "Thu Oct 18 21:28:36 2007: Time for all triggers in r +eport period (60s): 1.340150s"); for my $msg (@msgs) { if ($msg =~ /Time for all triggers in report period \((\d+)s\)/) { my $time = ${1}; # Insert your logic here... if ( $time >= 600) { print "Time ($time) >= 600\n"; } elsif($time >= 300) { print "Time ($time) >= 300\n"; } elsif($time >= 60 ) { print "Time ($time) >= 60\n"; } else { print "Time ($time) < 60\n"; } } }
      thank you very much to all!!!

      this is exactly what I needed. I was able to play around with it as I entered some bogus text in a text file:
      Fri Oct 19 14:11:53 2007: Time for all triggers in report period (60s): 1.393467s

      Fri Oct 19 14:12:53 2007: Time for all triggers in report period (120s): 1.416134s

      Fri Oct 19 14:12:53 2007: Time for all triggers in report period (300s): 1.416134s