DISCLAIMER: These are just my opinions, and are hardly facts (and I figure
many will disagree with me).
I don't see anything that could be considered the "wrong" way, but here are
a few things you could have done...
# your code
for (@scores) {
$_ =~ /([0-9][0-9]\.[0-9][0-9])/;
$vals[$counter] = $1;
$counter++;
}
# alternate
for (@scores) {
/(\d\d\.\d\d)/; # "$_ =~" is implied, use \d for digit
$vals[$counter++] = $1; # two statements in one
}
# your code
our @scores = `cat /home/johann/smail/Spam/* | grep ^Subject:` ;
# alternate - doesn't depend on cat/grep, works on any OS
our @scores = ();
for (</home/johann/smail/Spam/*>) {
open IN, $_ or next; # skips if file can't be opened
push @scores, grep {/^Subject/} (<IN>);
close IN;
}
# alternate - more elaborate, handles both of above
our @vals = ();
for (</home/johann/smail/Spam/*>) {
open IN, $_ or next; # skips if file can't be opened
push @vals, map {/(\d\d\.\d\d)/} grep {/^Subject/} (<IN>);
close IN;
}
This last one *should* (i.e. untested) read in from the file, grep lines
starting with "Subject", match "\d\d\.\d\d", and add the matched result to
@vals. This removes your counter, removes @scores, and will hopefully be
faster (not sure). It should also work on any OS that it is run on.
Then you have this...
# your code
my $highest = @scores;
$highest -= 1;
# alternate
my $highest = $#scores; # returns last element index
# more of your code
open (FH, ">/home/johann/.spamscore") || die $!;
print FH $scores[$highest];
close(FH);
# alternate - replaces both parts, no variable $highest
open (FH, ">/home/johann/.spamscore") || die $!;
print FH $scores[-1]; # "-1" is a shortcut for 1st from the end
close(FH);
# alternate - same but includes the sort as well (uses @vals directly)
open (FH, ">/home/johann/.spamscore") || die $!;
print FH ((sort @vals)[-1]);
close(FH);
# the whole thing (untested!)...
#!/usr/bin/perl
use strict;
use warnings;
our @vals = (); # decimal values
# open matching files, extract values from subject
for (</home/johann/smail/Spam/*>) {
open IN, $_ or next; # skips if file can't be opened
push @vals, map {/(\d\d\.\d\d)/} grep {/^Subject/} (<IN>);
close IN;
}
# save highest value to disk
open (FH, ">/home/johann/.spamscore") || die $!;
print FH ((sort @vals)[-1]);
close(FH);
Again, there is no real right/wrong way, and it depends on what you are
trying to accomplish. If your goal is readability, then you may wish to
avoid the map/grep I used. If your goal is speed you might (and I am no
expert on this) find that using map/grep is faster. Less variables is
usually better for both readability and performance, so don't create vars
you don't really need (like $highest). Comments are also a good idea, it
will help if you need to modify the code later on.
Rob
-----Original Message-----
From: Johann Snyman [mailto:[EMAIL PROTECTED]
Sent: Wednesday, February 26, 2003 12:42 PM
To: [EMAIL PROTECTED]
Subject: Newby first little script. (Lots of errors and wrong ways of
doing things)
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!
#!/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
our @vals;
our $counter = 0;
for (@scores) {
$_ =~ /([0-9][0-9]\.[0-9][0-9])/;
$vals[$counter] = $1;
$counter++;
}
my $saved = `cat /home/johann/.spamscore` || die $!;
chomp($saved);
push @vals, $saved;
@scores = sort(@vals);
#for (@scores) {
# print $_,"\n";
# }
my $highest = @scores;
$highest -= 1;
open (FH, ">/home/johann/.spamscore") || die $!;
print FH $scores[$highest];
close(FH);
__END__
Thanks!
--
QUIPd 1.02: (342 of 611)
-> A computer's attention span is as long as its power cord.
http://getafix.homelinux.org/
##2155
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]