#!C:/Perl/bin
use strict;
use warnings;
use Date::Calc qw /Today Delta_Days/;
use LWP::Simple;
use POSIX qw /strftime/;
# umask 022 or die "Failed to set umask: 022\n"; #umask? Not on 'doze
sub output;
my $url = 'http://www.perlmonks.org/index.pl?node_id=3559&displaytype=print';
$_ = get $url or die "Failed to fetch '$url'\n";
my $target_dir = "c:/__wo_ww/"; # MODIFY TO SUIT YOUR NEEDS. was /tmp in Abigail-II's node, cited above
my $xp_file = "$target_dir/xp.html";
my $arts_file = "$target_dir/arts.html";
my $days_file = "$target_dir/days.html";
my $xp_day_file = "$target_dir/xp_day.html";
my $xp_art_file = "$target_dir/xp_art.html";
my $art_day_file = "$target_dir/art_day.html";
my %data;
while (m!
]*>
(\d+) |
([^<]+) |
(\d+) |
(\w+) |
(\d+)-(\d+)-(\d+) | !gx) {
my ($pos, $name, $xp, $arts, $yr, $mon, $day) =
($1, $2, $3, $4, $5, $6, $7);
$xp -= 1000000 if $name =~ /^vroom/;
my $days = Delta_Days $yr, $mon, $day, Today;
$data {$name} {xp} = $xp;
$data {$name} {arts} = $arts =~ /None/ ? 0 : $arts;
$data {$name} {days} = $days;
$data {$name} {xp_day} = sprintf "%.2f" => $xp / $days;
$data {$name} {xp_art} = $arts =~ /None/ ? "999999"
: sprintf "%.2f" => $xp / $arts;
$data {$name} {art_day} = $arts =~ /None/ ? 0
: sprintf "%.2f" => $arts / $days;
}
# Rank them.
for my $field (qw /xp arts days xp_day xp_art art_day/) {
my $new_field = "${field}_rank";
my $count = 0;
foreach my $name (sort {$data {$b} {$field} <=>
$data {$a} {$field}} keys %data) {
$data {$name} {$new_field} = ++ $count;
}
}
output "xp", $xp_file;
output "arts", $arts_file;
output "days", $days_file;
output "xp_day", $xp_day_file;
output "xp_art", $xp_art_file;
output "art_day", $art_day_file;
sub output {
my ($key, $file) = @_;
my @names = sort {$data {$b} {$key} <=> $data {$a} {$key}} keys %data;
my $now = strftime "%e %B %Y", localtime;
open my $fh => ">", $file or die "Failed to open $file: $!\n";
print $fh <<"--";
Pointless Perlmonks Saints Statistics
Home
Pointless stats
Pointless Perlmonks Saints Statistics
Name
| Articles
| XP
| Days
| XP per day
| XP per article
| Articles per day |
--
foreach my $name (@names) {
print $fh "$name | ";
foreach my $key (qw /arts xp days xp_day xp_art art_day/) {
my $rank = "${key}_rank";
print $fh "$data{$name}{$key} | " .
"($data{$name}{$rank}) | ";
}
print $fh "
\n";
}
print $fh <<"--";
Copyright 2003 by Abigail.
Page last modified: $now
Comments to: \$web\$\@abigail.nl
|
--
close $fh or die "Failed to close $file: $!\n";
}