What I did was take the information in the database and split the lines, ran them through a for loop and printed them to a temp file. So if the first line was 12|netscape, then I printed netscape 12 times in the temp file, if the second line was 10|microsoft, I printed it 10 times in the temp file, and recounted them and resorted them. This is never going to work when I get to number above 1000. What I would like to do is just sort the lines in the original database numerically, on the first field, but with out rewritting them, if that's possible.
Take the code and chop off everthing after EOT and see if you can sort the $logpath file numerically.
#!/perl/bin/perl -w
use CGI;
$q = new CGI;
for $key ( $q->param() ) { $form{$key} = $q->param($key); }
$logpath = "data/browser.dat";
$browser = $form{'browser'};
open (LOG, "$logpath");
@data = <LOG>;
close(LOG);
$not_found = 1;
if($browser) {
open (LOG, ">$logpath");
foreach $line(@data) {
chomp($line);
($fcount,$fbrowser)= split(/\|/,$line);
if ($fbrowser eq $browser) {
$not_found = 0;
$fcount = $fcount+1;
print LOG "$fcount|$fbrowser\n";
}
else {
print LOG "$line\n";
}
}
close(LOG);
if($not_found) {
open (LOG,">>$logpath");
print LOG "1|$browser";
close(LOG);
}
}
# prints out log and form to browser
print "Content-type: text/html\n\n";
open (LOG, "$logpath");
@data = <LOG>;
close(LOG);
foreach $line(@data) {
chomp($line);
print "$line<br>";
}
close(LOG);
print <<EOT;
<FORM ACTION="basic.pl" METHOD="POST">
<SELECT NAME="browser">
<OPTION VALUE="microsoft">microsoft</OPTION>
<OPTION VALUE="netscape">netscape</OPTION>
<OPTION VALUE="aol">aol</OPTION>
<OPTION VALUE="mozilla">mozilla</OPTION>
<OPTION VALUE="opera">opera</OPTION>
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Submit">
</FORM>
EOT
| [reply] [d/l] |
my %browsers = ();
foreach ($line) { # eg '12|netscape'
$browsers{(split(/|/))[1]} = (split(/|/))[0];
}
print sort { $browsers{$a} <=> $browsers{$b} } keys %browsers;
UPDATE: Looks like it's getting late... the var in the foreach loop should be $_, not $line (fixed), thereby providing for the implicit split.
| [reply] [d/l] [select] |