#! perl use strict; use warnings; use autodie; die "To use me, give me the word list file as argument\n" unless defined $ARGV[0]; my %letter_lines; my $evt; my $niter = 0; for (my $cycled = 0; !$cycled; warn "going back to the beginning\n" unless $cycled) { open my $fh, '<', $ARGV[0]; FILE_ITER: while (my $word = <$fh>) { my @letters = split '', $word; ++$niter; if (defined $evt) { WORD_ITER: for my $i (0 .. $#letters) { if ($evt eq $letters[$i]) { my $j = $i + 1; $evt = $i < $#letters ? $letters[$j] : undef; if (defined $evt) { if (defined $letter_lines{$.}{$j}) { warn "we have cycled: line $. letter $j\n"; $cycled = 1; last FILE_ITER; } warn "adding to hash line $. letter $j\n"; $letter_lines{$.}{$j} = 1; print $evt; } last WORD_ITER; } } } elsif (defined $letter_lines{$.}{0}) { warn "we have cycled: doing line $. letter 0 again\n"; $cycled = 1; last FILE_ITER; } else { $letter_lines{$.}{0} = 1; warn "adding to hash line $. letter 0\n"; $evt = shift @letters; print $evt; } } close $fh; } warn "cycled in $niter iterations\n";