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: 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) { $entry =~ /\[([a-z0-9]{5})\]/; print "$1\n"; # print to screen # print FILE "$1\n"; # print to file } I have spent quite a bit of time refining this expression and it looks OK to me. I basically just need to extract the 5-digit hex string and then write it to a file (or to screen). This is what I get when I run the script: Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 8252c Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 8252c Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 8252d Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 8252d Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 82534 82534 Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 82535 Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 82534 82534 82534 Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044. 8253c 8253c 8253c Use of uninitialized value in concatenation (.) or string at ./magic.pl line 16, <DATA> line 1044 < --- Big long list --note that RequestIDs from REQ/RES pairs need not be adjacent in the list -- > The first thing that puzzles me is that it obviously extracting the RequestId substring correctly, it seems to complain about the "$1\n" expression in line 16. This looks quite OK to me and I am baffled why I am getting this message. The other thing that puzzles me is that there can only be a single REQ/RES pair in the file with a given ID. So the RequestID should not appear more than twice in the The output list. Yet there are many instances where the RequestID appears more than twice. Any help you guys can provide would be much appreciated. The Perl version is 5.8.4. on solaris 10 Regards, Bill Harpley