use strict; use warnings; use Data::Dumper; sub fits { my( $class, $subclass ) = @_; return 0 if length( $class ) < length( $subclass ); $class =~ s/$_// or return 0 for split //, $subclass; return 1; } open my $dict, "<", "2of12inf.txt" or die "Cannot open dictionary!\n"; my $words = do { local $/; <$dict> }; close $dict; my @words = sort { length($b) <=> length($a) } sort $words =~ /\b(\w{1,8})\b/g; my %classes; my $cnt = 0; for my $w (@words) { my $ws = join '', sort split //, $w; my $fitted = 0; for my $class (keys %classes) { if( fits( $class, $ws ) ) { $classes{$class}{$w}++; $fitted++; } } $classes{$ws}{$w}++ unless $fitted; } my @sorted = sort { scalar keys %{$classes{$b}} <=> scalar keys %{$classes{$a}} } keys %classes; for( @sorted ) { print "$_: ", scalar keys %{$classes{$_}}, "\n"; }