On Jun 26, 2014, at 2:05 AM, Uday Vernekar wrote:

> Please suggest if any Corrections Needed.

There are several improvements you could make.

> 
> [code]
> #!/usr/bin/perl
> 
> use 5.10.0;
> use strict;
> use warnings;
> #########################Pattern############################################
> #U/A/S|Test|            Test           |Loop | Run |Pass |Fail |  Arguments
> #     | #  |            Name           |Count|Count|Count|Count|
> #-----+----+---------------------------+-----+-----+-----+-----+-----------
> #     |  72| Traffic Test              |    1|  561|  560|    1| (none)
> ############################################################################  
>    
> my $pattern;

"$pattern" is not a good variable name for holding a string that matches some 
pattern. The 'pattern' is embedded in your regular expression. I would use 
something like "$match" or $found.

> open (my $Log_file, '<', '/tmp/EO-PCPE-23-10GT') || die "Couldn't open 
> /tmp/EO-PCPE-23-10GT\n\t $!";

When posting programs to a mailing list, you can use the special <DATA> file 
handle and put the lines at the end of your program after a line containing 
just a '__DATA__' marker. That way, people who do not have access to your data 
file will be able to run your program.

> while(<$Log_file>)

It is usually better to use explicit variables:

  while( my $line = <$Log_file> ) {
    if( $line =~ ... ) {

> {
> 
> if($_ =~ 
> m/^(.+?)\|(.+72)\|(.+?)\|(.+?)\|(.+[0-9]|[0-9]|[0-9])\|(.+[0-9]|[0-9]|[0-9])\|(.+?)\|(.+?)$/)

This reqular expression is very long and hard to read. You seem to want match 
any line that:

1. Has seven '|' characters delimiting eight fields.
2. Has '72' in field 2.
3. Has numbers in fields 5 and 6.

I would recommend first splitting the line, then checking the individual fields 
for their desired content.

In addition, the regex fragment '(.+[0-9]|[0-9]|[0-9])' may not be doing what 
you think. This fragment will match:

1. At least one character followed by a digit (0-9) OR
2. A digit (0-9) OR
3. A digit (0-9)

The | character is alternation. You seem to be treating it as concatenation. 
The second and third alternatives are identical, and the third one is redundant.

If you want to match three successive digits, these will all work:

[0-9][0-9][0-9]
[0-9]{3}
\d\d\d
\d{3}


> {
>  $pattern=$_;
> 
> 
> }
> 
> }
> print "Pattern Found:\n$pattern";
> my $uas=(split /\|/, $pattern)[0];
> $uas =~ s/^\s+//;
> my $test=(split /\|/, $pattern)[1];
> $test =~ s/^\s+//;
> my $test_name=(split /\|/, $pattern)[2];
> $test_name =~ s/^\s+//;
> my $loop_count=(split /\|/, $pattern)[3];
> $loop_count =~ s/^\s+//;
> my $run_count=(split /\|/, $pattern)[4];
> $run_count =~ s/^\s+//;
> my $pass_count=(split /\|/, $pattern)[5];
> $pass_count =~ s/^\s+//;
> my $fail_count=(split /\|/, $pattern)[6];
> $fail_count =~ s/^\s+//;
> my $arguments=(split /\|/, $pattern)[7];
> $arguments =~ s/^\s+//;

You can perform the split only once. You can also include optional whitespace 
in the delimiter string, which means the saved substrings will not include the 
whitespace:

  my( $uas, $test, $test_name, $loop_count, $run_count, $pass_count, 
$fail_count,
    $arguments ) = split('\s*\|\s*',$line);

> print '-' x 30, "\n";
> print "      Test Data       \n";
> print '-' x 30, "\n";
> print "UAS : $uas\n";
> print "Test : $test\n";
> print "Test Name : $test_name\n";
> print "Loop Count : $loop_count\n";
> print "Run Count : $run_count\n";
> print "Pass Count : $pass_count\n";
> print "Fail Count : $fail_count\n";
> print "Arguments : $arguments\n";
> print '-' x 30, "\n";
> print "      RESULTS       \n";
> print '-' x 30, "\n";

You can use a 'HERE' document to print these lines:

    print <<EOS;
------------------------------
      Test Data       
------------------------------
UAS : $uas
Test : $test
Test Name : $test_name
Loop Count : $loop_count
Run Count : $run_count
Pass Count : $pass_count
Fail Count : $fail_count
Arguments : $arguments
------------------------------
      RESULTS       
------------------------------
EOS


So putting that altogether, here is an improved program:

[code]

#!/usr/bin/env perl
use strict;
use warnings;
while( my $line = <DATA> ) {
  chomp($line);
  next if $line =~ /^-/;
  my @f = split('\s*\|\s*',$line);
  next unless scalar @f == 8;
  my( $uas, $test, $test_name, $loop_count, $run_count, $pass_count, 
$fail_count,
    $arguments ) = @f;
  if( $test eq '72' ) {
    print <<EOS;
------------------------------
      Test Data       
------------------------------
UAS : $uas
Test : $test
Test Name : $test_name
Loop Count : $loop_count
Run Count : $run_count
Pass Count : $pass_count
Fail Count : $fail_count
Arguments : $arguments
------------------------------
      RESULTS       
------------------------------
EOS
    if( $fail_count != 0 && $run_count >= 0 ) {
      print "Result: Fail\n";
    }elsif( $fail_count == 0 && $run_count > 0 ) {
      print "Result: Pass\n";
    }
  }
}
__DATA__
U/A/S|Test|            Test           |Loop | Run |Pass |Fail |  Arguments
     | #  |            Name           |Count|Count|Count|Count|
-----+----+---------------------------+-----+-----+-----+-----+-----------
     |  72| Traffic Test              |    1|  561|  560|    1| (none)

[code]


--
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