The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
package Text::T9;
use Exporter;
our @ISA = qw( Exporter );
our @EXPORT = qw( t9_find_words );
our $VERSION = '1.0';
use strict;
use warnings;
use Carp;

our @T9NL = ( '', '', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ' );

sub t9_find_words($$)
{
  my $num = shift;
  my $words = shift;
  
  return () unless $num =~ /^[2-9]+$/;
  
  my $len = length( $num );
  my $re;
  for( 0 .. $len - 1 )
    {
    $re .= "[" . $T9NL[substr( $num, $_, 1 )] . "]";
    }
  $re = "^$re\$";
  return grep { /$re/i } grep { length( $_ ) == $len } @$words;
}

=pod

=head1 NAME

Text::T9 - Text in 9 keys (T9) input.

=head1 SYNOPSIS

  # array with words
  my @words = qw( this is just a simple kiss test lips here how );
  
  # what is word(s) for the sequence 
  print "$_ " for( t9_find_words( 5477, \@words ) );
  
  # this prints: kiss lips

=head1 DESCRIPTION

What is T9 Text Input?

T9 Text Input is software that enables users to easily enter text 
into small devices with limited size keyboards, like mobile phones. 
T9 Text Input replaces the traditional "multi-tap" method of entering 
text providing the ability to enter text using only one keystroke per 
letter.

(you can find more inforation at http://www.t9.com/)

This module provides simple way to find which words match a number
sequence in T9 sense.

Examples:

  5477   : KISS, LIPS 
  8447   : THIS 
  746753 : SIMPLE 
  469    : HOW 

Allowed number are 2,3,4,5,6,7,8,9 which are mapped in this way:

  2 ABC
  3 DEF
  4 GHI
  5 JKL
  6 MNO
  7 PQRS
  8 TUV
  9 WXYZ

=over 4

=item t9_find_words( $num, \@words_arr )

This functions takes two arguments: number sequence and words array 
reference. The return value is a list of matching words.

=back

=head1 EXAMPLES

  open( i, "/tmp/words.lst" );
  @words = <i>;
  close( i );
  chomp( @words );
  print "$#words were loaded\n";
  
  for my $num ( qw( 5477 8447 746753 469 ) )
    {
    print "$num: ";
    print "$_ " for( t9_find_words( $num, \@words ) );
    print "\n";
    }

=head1 AUTHOR

  Vladi Belperchinov-Shabanski "Cade"
                                     
  <cade@biscom.net> <cade@datamax.bg> <cade@cpan.org>

  http://www.biscom.net/~cade

=cut