Hi John,

Thanks for your advice. 

(1) I actually have 'use warnings' enabled in the complete script.
    'use strict' just gives me a load of unrelated compilation errors
like
        "Global symbol "$INBOX" requires explicit package name at
./magic.pl line 8."

(2) I have also tried a WHILE loop but the result is the same 

(3) the hex digits in the Request_Id all have A-F in lower case (so
there is only the range a-z)
    However, it does no harm to put this in, just in case it changes in
the future. So I have made this change

 (4) I tried [[:xdigit:]] but to no avail

So I remain stuck at square one !!

Regards,

Bill



-----Original Message-----
From: John W. Krahn [mailto:jwkr...@shaw.ca] 
Sent: Monday, January 26, 2009 5:20 PM
To: Perl Beginners
Subject: Re: Simple regex problem has me baffled

Bill Harpley wrote:
> Hello,

Hello,

> I have simple regex problem that is driving me crazy.
> 
> I am writing a script to analyse a log file. It contains Java related 
> information about requests and responses.
> 
> Each pair of Request (REQ) and Response (RES) calls have a unique 
> Request ID. This is a 5 digit hex number contained in square brackets 
> (e.g.  "[81c2d]" ).
> 
> Using timestamps in each log entry, I need to calculate the time 
> difference between the start of the Request and the end of the
Response.
> 
> As a first step, I thought I would identify the matching REQ/RES pairs

> in the log and then set about extracting the timestamp information and

> doing the calculations.
> 
> I started with a simple script to extract the Request IDs from each 
> log entry. Here is what one looks like (names have been changed to 
> protect the innocent).
> 
> 
> [2009-01-23 09:20:48,719]TRACE [server-1] [http-80-5] 
> a...@mydomain.net
> :090123-092048567:f5825 (SetCallForwardStatusImpl.java:call:54) - 
> RequestId [81e80] SetCallForwardStatus.REQ { accountNumber:=W12345, 
> phoneNumber:=12121212121, onBusyStatus:=true, busyCurrent:=voicemail, 
> onNoAnswerStatus:=false, noAnswerCurent:=voicemail, 
> onUncondStatus:=false, uncondCurrent:=voicemail }
> 
> So I need to extract the 5 hex digits in "RequestId [81e80]". Sounds 
> simple, eh?
> 
> Here is a fragment of my initial script:

You should have the warnings and strict pragmas at the beginning of your
program to let perl help you find mistakes:

use warnings;
use strict;


> open ( DATA, "< $INBOX/sample.log") || die "Cannot open source file:
> $!";
> open ( FILE, "> $INBOX/request.dat") || die "Cannot open request file:
> $!";
> 
> chomp(@list=<DATA>);
> 
> foreach $entry(@list)
> {

It looks like you don't really have to read the entire file into memory
in order to process it.  You should perhaps use a while loop instead
which will only read one line at a time:

while ( my $entry = <DATA> ) {
     chomp $entry;

And you may not need to chomp the current line if you are not accessing
the data at the end of the line.


>         $entry =~ /\[([a-z0-9]{5})\]/;

You are looking for hexadecimal digits so you want either [a-fA-F0-9] or

[[:xdigit:]] instead.


>         print "$1\n";         # print to screen

The contents of $1 are only valid if the regular expression matched 
successfully, otherwise $1 retains the contents from the previously 
successful match.

     if ( $entry =~ /RequestId\s+\[([a-fA-F0-9]{5})\]/ ) {
         print "$1\n";
     }


>         # print FILE "$1\n";          # print to file
> }



John
-- 
Those people who think they know everything are a great
annoyance to those of us who do.        -- Isaac Asimov

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/



--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to