Perl Script Help

Hi Kevin/Tom/All,

I put your script in a function and it is working perfectly fine. I created another similar function that is also evaluating the time only.

Here for me the catch is that the userid is not coming directly but coming inbetween a big xml string, i want to extract that userid, i did some regular expression matches but failed. Can you help me in this.

The username is coming from here ---   Username: 01172275
if (/Username:\s+(\S+)$/) {
            $user = $1;

The username is coming from this string--

updateAttributes: XML Request [<POLICYREQ><MESSAGEID>1</MESSAGEID><CALLERID>4 - MLS - MLS: com.arcot.aok.web.controllers.rf.RFSyncClientDIDController|1:2594742</CALLERID><SESSIONID>1:2594742</SESSIONID><AUTHRESULT>UNSPECIFIED</AUTHRESULT><IDENTITY><USERID>01172275</USERID><GROUP>MLS</GROUP><SUBGROUP>SUBGROUP2</SUBGROUP></IDENTITY><LOCATION><IPADDRESS>208.36.8.182</IPADDRESS></LOCATION><DEVICEID </DEVICESIG></POLICYREQ>]

I want to do a similar check as before.
Can you help me out guys please.

What is did is--

#$str=~/(?:.*<USERID>)(.*)(?:<\/USERID>.*$)/;
			#print $str;

Thanks
NT

my $userid;
if ($str =~ /<USERID>(.*?)<\/USERID>/) }
   $userid = $1;
}
print $userid;

Hi Kevin,

The string which i mentioned earlier is in a log file.Its not a seperate string. I implemented exactly the same script in another function. When i run the other function it does not do anything.

The other function is--

sub post_evaluate_action_time
{
  my %hash;
open(my $LOG, 'C:\aokapplication') or die "$!";
LOOP1: while(<$LOG>) {
   my $user;
   my $str;
   if (/Next State: risk_did_persist$/) {
	   LOOP2: while (<$LOG>) {
		   #if (/<USERID>\s+(\S+)$/) 
           if ($str =~ /<USERID>(.*?)<\/USERID>/)
		 {
             $user = $1;
         	 #$str=~/(?:.*<USERID>)(.*)(?:<\/USERID>.*$)/;
			 #print $str;
		 	 $hash{$user} = {SessionID => '', Time => 0 };
		 }
		   else {
			     next LOOP2;
		        }

LOOP3: while (<$LOG>) {
	if (/ErrorMsg:SESSIONID :\s+(\S+)$/) {
           $hash{$user}{SessionID} = $1;
           next LOOP3;
	}
	elsif (/postEvaluate: End-to-end time in millisecond (\S+)$/) {
		$hash{$user}{Time} += $1;
               next LOOP1;
	        }
          }
	   }
   }
}

close ($LOG);
use Data::Dumper;
print Dumper \%hash;
}

#evaluate_risk_action_time();
print "The post_evaluate_time function is called here\n";
post_evaluate_action_time();

The log snippet for this is --

2009-02-09 00:01:58,970 [TP-Processor28] INFO  FlowController,(TP-Processor28:121) - Next State: risk_did_persist
2009-02-09 00:01:58,970 [TP-Processor28] DEBUG BaseRedirectController,(TP-Processor28:116) - [com.arcot.aok.web.controllers.rf.RFRiskAssessmentController]: : Next state: persistdid.htm
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG RFSyncClientDIDController,(TP-Processor28:30) - Entered com.arcot.aok.web.controllers.rf.RFSyncClientDIDController.preOnSubmit()
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG RiskFactory,(TP-Processor28:140) - The object is already created
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG RFSyncClientDIDController,(TP-Processor28:30) - Secondary Auth entry class type: java.lang.Integer
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG RiskXActionAPI,(TP-Processor28:480) - updateAttributes: XML Request [<POLICYREQ><MESSAGEID>1</MESSAGEID><CALLERID>4 - MLS - MLS: com.arcot.aok.web.controllers.rf.RFSyncClientDIDController|1:2594791</CALLERID><SESSIONID>1:2594791</SESSIONID><AUTHRESULT>UNSPECIFIED</AUTHRESULT><IDENTITY><USERID>01394498</USERID><GROUP>MLS</GROUP><SUBGROUP>SUBGROUP2</SUBGROUP></IDENTITY><LOCATION><IPADDRESS>69.107.99.223</IPADDRESS></LOCATION><DEVICEID type="http">o2S0nuXNATYDqL235Vz/foPkL+WifrsaN9QCIyKuTX1bHZi0ojKgrZBxH6qfcbRy</DEVICEID>us"}}}</DEVICESIG></POLICYREQ>]
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG SocketPool,(TP-Processor28:32) - borrowSocket: Trying to get lock localCallGetConnectionFlag false callGetConnectionFlag true
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG SocketPool,(TP-Processor28:37) - borrowSocket: In if(callGetConnectionFlag)
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG SocketPool,(TP-Processor28:68) - borrowSocket: Calling borrowObject
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG PoolableSocketFactory,(TP-Processor28:195) - activateObject not supported : No action taken on Socket[addr=/172.16.64.30,port=7680,localport=4723]
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG SocketPool,(TP-Processor28:70) - borrowSocket: Out of borrowObject
2009-02-09 00:01:59,033 [TP-Processor28] DEBUG SocketPool,(TP-Processor28:78) - borrowSocket: Calling Notify
2009-02-09 00:01:59,064 [TP-Processor28] DEBUG PoolableSocketFactory,(TP-Processor28:184) - Validating Object:Socket[addr=/172.16.64.30,port=7680,localport=4723]
2009-02-09 00:01:59,064 [TP-Processor28] INFO  PoolableSocketFactory,(TP-Processor28:199) - passivateObject called on Socket[addr=/172.16.64.30,port=7680,localport=4723]
2009-02-09 00:01:59,064 [TP-Processor28] DEBUG PoolableSocketFactory,(TP-Processor28:184) - Validating Object:Socket[addr=/172.16.64.30,port=7680,localport=4723]
2009-02-09 00:01:59,064 [TP-Processor28] DEBUG RiskXActionAPI,(TP-Processor28:486) - updateAttributes: Response Packet [<POLICYSERVERDOC DATATYPE="XML"><POLICYRES><MESSAGEID>2088926475</MESSAGEID><SESSIONID>1:2594791</SESSIONID><ACTION></ACTION><RESPONSECODE>-1</RESPONSECODE><ERRORSTRING></ERRORSTRING><ERRORCODE>0</ERRORCODE><TRANSACTIONID>1:2594792</TRANSACTIONID><RISKSCORE>0</RISKSCORE><DEVICEID>o2S0nuXNATYDqL235Vz/foPkL+WifrsaN9QCIyKuTX1bHZi0ojKgrZBxH6qfcbRy</DEVICEID><RISKDETAIL></RISKDETAIL></POLICYRES></POLICYSERVERDOC>]
2009-02-09 00:01:59,064 [TP-Processor28] DEBUG ResponseMessageParser,(TP-Processor28:214) - Error code:0 ErrorMsg:TRANSACTIONID : 1:2594792
2009-02-09 00:01:59,064 [TP-Processor28] DEBUG ResponseMessageParser,(TP-Processor28:214) - Error code:0 ErrorMsg:SESSIONID : 1:2594791
2009-02-09 00:01:59,095 [TP-Processor28] DEBUG ResponseMessageParser,(TP-Processor28:259) - ArcotPacket MessageID [2]
2009-02-09 00:01:59,095 [TP-Processor28] INFO  RiskXActionAPI,(TP-Processor28:155) - postEvaluate: End-to-end time in millisecond 62

Here i need to take the userid from the xml string and rest are same. I tried some option but the function does not do anything.
Am i doing anything wrong here.

The main problem is you are trying to match $str in your code, and it is not the lines from the file. Here it is fixed:

sub post_evaluate_action_time {

open(my $LOG, 'C:\aokapplication') or die "$!";
LOOP1: while(<$LOG>) {
   my $user;
   if (/Next State: risk_did_persist$/) {
      LOOP2: while (<$LOG>) {
         if (/<USERID>(.*?)<\/USERID>/) {
            $user = $1;
            $hash{$user} = {SessionID => '', Time => 0 };
         }
         else {
            next LOOP2;
         }
         LOOP3: while (<$LOG>) {
            if (/ErrorMsg:SESSIONID :\s+(\S+)$/) {
               $hash{$user}{SessionID} = $1;
               next LOOP3;
            }
            elsif (/postEvaluate: End-to-end time in millisecond (\S+)$/) {
               $hash{$user}{Time} += $1;
               next LOOP1;
            }
         }
      }
   }
}

close ($LOG);
use Data::Dumper;
print Dumper \%hash;

}

print "The post_evaluate_time function is called here\n";
post_evaluate_action_time();

Thank you Very much Kevin.
You are a real help to me.
I am in the process of enhancing the script and will be requiring your guidance for this.So i will post as and when i came across any problem.

Thanks for your valueable time and guidance.

Thanks
NT

my $filename = 'log.txt';
open (FH,$filename);
my ($username,$session,$evalrisk);
my ($fu,$fe,$fs);
$fu=$fe=$fs=0;
while (my $line = <FH>){
chomp($line);
if ($line =~ m/Username:\s(.)?/){
$username= $1;
$fu=1;
$fe=$fs=0;
}
if ($line =~ m/SESSIONID\s:\s(.
)?/){
$session = $1;
$fs=1;
$fe=0;
}
if ($line =~ m/evaluateRisk:\s(.*)?/){
$evalrisk =$1;
$fe=1;
}

    if \($fu && $fs && $fe\)\{
            print "Userid :\\t$username\\n";
            print "session:\\t$session\\n";
            print "$evalrisk\\n";
            $fu=$fe=$fs=0;
    \}

}

This is done with the assumption that username , session and endtime occurs in an order . If the format changes need to change the script accordingly. Hope this helps . Lemme know if u have ny more queries in this regard

Hi Daptal,

Thank you for your kind help. I will give it a try and will try myself to modify, if anything comes i will post.
Thanks once again.

NT