Thanks to all........cheers
On Thu, Jun 26, 2014 at 10:28 PM, Jim Gibson <jimsgib...@gmail.com> wrote: > > 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/ > > > -- ********************************************************* Don't ask them WHY they hurt you, because all they'll tell you is lies and excuses. Just know they were wrong, and try to move on. **********************************************************