#!/usr/bin/perl use strict; my $file = shift || die "USAGE: $0 filename [ max_number_to_show ]"; my $most = shift || 0; open(F, "< $file"); die "Error opening $file: $!, stopped" if $?; my @lines = map { /^\s*(".*"),?/ ? $1 : () } (); close(F); # First line is xy-size, numcolors and char-width my ($x, $y, $num, $wc) = shift(@lines) =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/; die "$file: data line malformed, stopped" unless ($x && $y && $num && $wc); my %colors; # Build color table for my $i (1 .. $num) { die "$file: color spec line #$i malformed, stopped" unless (shift(@lines) =~ /^"(.).*c\s+(\S+)/i); $colors{$1} = $2; } my (%color_count, $color, @line); for my $line (1 .. $y) { die "$file: Data line #$line malformed, stopped" unless ($lines[$line - 1] =~ /^"(.*)"$/ && (length($1) == $x*$wc)); @line = split(//, $1); while (length($color = join('', splice(@line, 0, $wc))) == $wc) { $color_count{$color}++; } } my @sorted = sort { $color_count{$b} <=> $color_count{$a} } keys %color_count; # If specified, show only $most values @sorted = splice(@sorted, 0, $most) if $most; print "Color Frequency\n"; for (@sorted) { printf("%-20s %d\n", ($colors{$_} =~ /none/i ? 'None (transparent)' : $colors{$_}), $color_count{$_}); } exit;