Oops, I forgot to detab before inlining that, and there was some loose ends. Here it is again inlined and attached. It's not optimized in any way, opting instead for a quick straightforward implementation. Incomplete, possibly buggy, completely undocumented. I didn't write it as a patch for Casey's module because of the requirement for a dictionary file which is fairly standard on unixish, but must be obtained for other OS.

package Leetspeak;

use strict;
use warnings;

our $DEBUG = 0;

sub new {
    my $package = shift;
    my %args = @_;

    my $dict =
        (grep defined && -e, ( $args{dict}, '/usr/share/dict/words' ))[0];

    my %data = ( dict => $dict );
    my $self = bless( \%data, $package );

    $self->_read_dict();

    return $self;
}


{ my %trans_tbl = ( '@' => [ 'A' ], '$' => [ 'S' ], '+' => [ 'T' ], '0' => { '0' => [ 'O' ], '0r' => [ 'ER' ], }, '1' => [ 'I', 'L' ], '2' => [ 'Z' ], '3' => { '3' => [ 'E' ], '3y3' => [ 'I' ], }, '4' => [ 'A' ], '5' => [ 'S', 'Z' ], '6' => [ 'B', 'G' ], '7' => [ 'T' ], '8' => [ 'B' ], '9' => [ 'P', 'Q' ], 'l' => [ 'I' ], 'p' => { 'p' => [ 'O' ], 'ph' => [ 'F' ], }, 'x' => [ 'CK', 'CKS' ], 'z' => [ 'S' ], );


sub translate { my $self = shift; my $word = shift; my $start = shift || 0;

        print "translate( $word, $start )\n" if $DEBUG;

        return $word if $self->_has_word( $word );

        for my $i ( $start .. length( $word ) - 1 ) {
            my $ch = substr( $word, $i, 1 );
            next unless exists( $trans_tbl{$ch} );
            my $trans = ( ref( $trans_tbl{$ch} ) eq 'HASH' ) ?
                          $trans_tbl{$ch} : { $ch => $trans_tbl{$ch} };

            foreach my $key ( keys( %$trans ) ) {
                my $key_len = length( $key );
                if ( substr( $word, $i, $key_len ) eq $key ) {
                    foreach my $tr ( @{ $trans->{$key} } ) {
                        print "substr( $word, $i, $key_len ) = $tr\n"
                            if $DEBUG;
                        my $new_word = $word;
                        substr( $new_word, $i, $key_len ) = lc( $tr );
                        my $offset = $key_len - length( $tr );
                        $offset ||= 1;
                        my $result =
                            $self->translate( $new_word, $i + $offset );
                        return $result if $result;
                    }
                }
            }
        }

        return undef;

    }

}


sub dict { return $_[0]->{dict} }

sub _read_dict {
    my $self = shift;
    my %words;

    open( my $fh, '<', $self->{dict} ) or die $!;
    while (defined( my $word = <$fh> )) {
        chomp( $word );
        $words{$word} = 1;
    }
    close( $fh );

    $self->{words} = \%words;
    return scalar %words;
}


sub _has_word { my $self = shift; my $word = shift; $word = lc( $word ); return 1 if exists( $self->{words}{$word} ); }

1;

Attachment: Leetspeak.pm
Description: Perl program

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>

Reply via email to