sub UniqInits { # takes an array of unique names and returns a hashref { 'a man' => [ 'a', 'm'], ... } my %data; my $maxnames = 0; for my $name (@_) { chomp $name; my @names = split /[^\w]+/,$name; $maxnames = @names if @names > $maxnames; $_ = ucfirst lc $_ for @names; $data{ "@names" } = \@names; } for my $index ( 0 .. $maxnames ) { for my $person ( keys %data ) { next if ! $data{$person}[$index]; my $old_name = $data{$person}[$index]; for my $length ( 1 .. length $old_name ) { $data{$person}[$index] = substr( $old_name, 0, $length ); my $match = 0; for ( keys %data ) { next if $_ eq $person || @{$data{$_}} != @{$data{$person}}; my $test_name = $data{$_}[$index]; $data{$_}[$index] = substr( $test_name, 0, $length ); my ($s_name , $s_test) = ("@{$data{$person}}", "@{$data{$_}}"); $data{$_}[$index] = $test_name; if ( $s_name eq $s_test ) { $match = 1; last; } } last if ! $match; } } } for my $name (keys %data) { $data{$name} = join '',@{$data{$name}}; } \%data; }