please Explain next if $line =~ /^-/; my @f = split('\s*\|\s*',$line); next unless scalar @f == 8;
On Fri, Jun 27, 2014 at 6:44 PM, Uday Vernekar <vernekaru...@gmail.com> wrote: > 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. > ********************************************************** > -- ********************************************************* 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. **********************************************************