#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @word; while(<>) { chomp; my $key = join '', sort split ''; push @{$word[length]{$key}}, $_; } my @ana; for my $i (reverse 3..$#word) { my $got_it; for my $key (keys %{$word[$i]}) { if (my @chain = find_chain($key)) { push @ana, @chain; $got_it = 1; } } last if $got_it; } for my $chain (@ana) { for my $key (@$chain) { my $len = length $key; print "[ @{$word[$len]{$key}} ]\n"; } print "\n"; } sub find_chain { my $key = shift; my $len = length($key)-1; return [ $key ] if $len < 3; my @rtn; my $old_chr = ''; for my $i (0..$len) { my $tmp = $key; next if (my $chr = substr($tmp, $i, 1, '')) eq $old_chr; $old_chr = $chr; next unless exists $word[$len]{$tmp}; if (my @chain = find_chain($tmp)) { unshift @$_, $key for @chain; push @rtn, @chain; } } delete $word[$len]{$key} unless @rtn; @rtn; }