Johann Snyman wrote:
> Hello there,
>
> I am a newby trying to learn pearl. I wrote my first little script,
> and I would love to se where I could have done things better (in a
> more proffesional way).
>
> Feedback would be appreciated!
Well you are off to a good start with lines two and three ;)
> #!/usr/bin/perl
> use strict;
> use warnings;
>
> our @scores = `cat /home/johann/smail/Spam/* | grep ^Subject:` ;
> # string looks like this: Subject: 10.20 Re: Hallo
Good, commenting your code is a good thing :)
However backticks aren't the only way or always the best way ... In this
case it's not a bad usage, but always be aware of when it COULD be. Reading
perldoc perlsec is a good place to observe some security issues. (Running
this under -T isn't a bad idea either.)
observe:
my @scores;
my @files = glob "/home/johann/smail/Spam/*";
foreach my $file (@files) {
open(IN, "<", $file) or die "Cannot open file $file: $!";
while (<IN>) {
next unless /^Subject:/;
push @scores, $_;
last; # found what we need, no need to go further with this file
}
close IN or die "Cannot close filehandle for $file: $!";
}
> our @vals;
> our $counter = 0;
no need to make these globals.. this will do:
my($counter, @vals);
> for (@scores) {
> $_ =~ /([0-9][0-9]\.[0-9][0-9])/;
> $vals[$counter] = $1;
> $counter++;
> }
# and in fact, you don't need $counter at all...
foreach my $score (@scores) {
# this avoids problems in the case of the regex NOT matching
unless ($score =~ /\s([\d]+\.[\d]+)\s/) {# assumes score is space-delimited
warn "$score did not match!";
next;
}
push @vals, $1;
}
> my $saved = `cat /home/johann/.spamscore` || die $!;
> chomp($saved);
> push @vals, $saved;
open IN, "<", "/home/johann/.spamscore"
or die "Cannot open .spamscore file: $!";
while (<IN>) {
chomp;
push @vals, $_ if $_;
}
close IN or die "Could not close .spamscore file: $!";
> @scores = sort(@vals);
> #for (@scores) {
> # print $_,"\n";
> # }
re-using the same array to describe something different isn't always a good
idea. rather,
my @newscores = sort @vals;
#this is also an easier way of writing the above debugging check ;)
#print "$_\n" foreach @newscores;
> my $highest = @scores;
> $highest -= 1;
why not just do:
#my $highest = $#newscores;
#although you don't need to... see below :)
> open (FH, ">/home/johann/.spamscore") || die $!;
>
> print FH $scores[$highest];
>
> close(FH);
this is ok, but again,
open FH, ">", "/home/johann/.spamscore"
or die "Cannot open .spamscore for writing!: $!";
print FH $newscores[$#newscores];
close FH or die "Cannot close output file .spamscore: $!";
> __END__
>
>
> Thanks!
>
useful [descriptive] die error messages can help debug things much more
easily.
This help any?
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]