ソーティング

本棚.orgを多い人順に並べたりするスクリプトを書いた。Perlのリファレンスと無名配列の練習の方が目的だったりするが。

# booksort.pl
# created:2005-02-24 01:33:53+09:00

use strict;
use encoding "shiftjis";

my %users;
my $all_book_sum;

&print_title("多い順に並べ替えたもの");

while(<>) {
	if (/ {4}[^\*]/) {
		chomp($_);
		my ($name, $book, $profile);
		if (/(.*)の本棚 \((.*)/) {
			($name, $book) = ($1, $2);
			if ($book =~ /(\d+)\/\d+\)[ |\t]+(.*)/ ) {
				$book    = $1;
				$profile = $2 unless ($2 eq '');
			}
			$name =~ s/ +(.*)/$1/;
			$users{$name} = [("$book", "$profile")];
			$all_book_sum += $book;
		}
	}
}

foreach my $username ( sort {$users{$b}->[0] <=> $users{$a}->[0] } keys %users ) {
	printf("%5d : %s : %s\n", $users{$username}->[0], $username, $users{$username}->[1]);
}

&print_title("登録されている本の総数:$all_book_sum");

&plot_data(\%users);

sub plot_data {
	my $users = shift;
	my %number;

	foreach $_ (keys %$users) {
		my $temp = $users{$_}->[0];
		$number{$temp}++;
	}

	&print_title("ヒストグラム表示");

	foreach $_ (sort {$b <=> $a} keys %number) {
		printf("%4d:(%3d):%s\n", $_, $number{$_}, '*'x"$number{$_}");
	}

}

sub print_title {
	my ($title) = @_;
	print "-"x100, "\n";
	print "$title\n";
	print "-"x100, "\n";
}

# booksort.pl ends here.

Firefoxでトップページ*1をコピペして、booksort.plと同じディレクトリにファイルを作っておく。(そのファイル名をbookdataとする)

そして、

perl booksort.pl < book > kekka

とすると、

                                                                                                                                                                                                      • -
多い順に並べ替えたもの
                                                                                                                                                                                                      • -
2712 : suchi : これらの本の画像はこちらです。棚ではなくて層です腰の高さ以上... (途中は省略)
                                                                                                                                                                                                      • -
登録されている本の総数:113689
                                                                                                                                                                                                      • -
                                                                                                                                                                                                      • -
ヒストグラム表示
                                                                                                                                                                                                      • -
2712:( 1):* 1676:( 1):* 1608:( 1):* 1589:( 1):* 1300:( 1):* (途中は省略) 0:(482):****** (ここに482個*が続く)

と出力する。

登録されている本の総数は11万冊以上もあるのか…。まあダブりをカウントしているので、その重複分をなくすと半分以下になりそうな気もする。

*1:正規表現の部分がFirefoxのものになっているので、IEとかじゃ無理かも。