Tie::Hash::Approx - Approximative match of hash keys using String::Approx


Tie-Hash-Approx documentation Contained in the Tie-Hash-Approx distribution.

Index


Code Index:

NAME

Top

Tie::Hash::Approx - Approximative match of hash keys using String::Approx

SYNOPSIS

Top

  use Tie::Hash::Approx;

  my %hash;
  tie %hash, 'Tie::Hash::Approx';

  %hash = (
    key  => 'value',
    kay  => 'another value',
    stuff => 'yet another stuff',
  );

  print $hash{'key'};  # prints 'value'
  print $hash{'koy'};  # prints 'another value' or 'value'
  print $hash{'staff'}; # prints 'yet another stuff'

  print tied(%hash)->FETCH('koy'); # prints 'value' and 'another value'

  delete $hash{kee};   # deletes $h{key} and $h{kay}

DESCRIPTION

Top

Following the idea of Tie::Hash::Regex, this module is an attempt to make fuzzy matches on hash keys. The module first tries to fetch the exact key of the hash, and failing that, the key is passed to the String::Approx' amatch function. Note that you can't (yet) pass modifiers to amatch.

To fetch multiple matching keys, you'll have to use something like:

 @all_matches = tied(%h)->FETCH('the key');

Note also the deleting a hash key will delete all the approximate matches, unless you provide the exact match of the key.

TODO

Top

Specify the "fuzziness" of the match (cf. the modifiers option in String::Approx).

AUTHOR

Top

Briac Pilpre < briac @ pilpre . com >

Thanks to Dave Cross for making Tie::Hash::Regex in the first place!

COPYRIGHT

Top

SEE ALSO

Top

perl(1). perltie(1). Tie::Hash. String::Approx


Tie-Hash-Approx documentation Contained in the Tie-Hash-Approx distribution.

package Tie::Hash::Approx;
use strict;
use vars qw($VERSION @ISA);

require Exporter;
require Tie::Hash;

use String::Approx('amatch');

@ISA     = qw(Exporter Tie::StdHash);
$VERSION = '0.03';

sub FETCH {
    my $this = shift;
    my $key  = shift;

    return undef unless %{$this}; # return if the hash is empty

    # We return immediatly if an exact match is found
    return $this->{$key} if exists $this->{$key};

    # Otherwise, the fuzzy search kicks in
    my @results = amatch( $key, keys( %{$this} ) );


    # wantarray doesn't work on tied hash, unless
    # you're using a "tied(%hash)->FETCH('foo');"
    # construct
    if (wantarray) {
       return @{$this}{@results};
    }
    else {
      return $this->{ $results[0] };
    }
}

sub EXISTS {
    my $this = shift;
    my $key  = shift;

    return undef unless %{$this};
	if ( $key eq '' ){
		return 1 if exists $this->{''};
		return 0;
	}

    return 1 if exists $this->{$key};
    return 1 if amatch( $key, keys( %{$this} ) );
	return 0;
}


sub DELETE {
    my $this = shift;
    my $key  = shift;

    return delete $this->{$key} if exists $this->{$key};
    my @results = amatch( $key, keys( %{$this} ) );

    # This will delete *all* the keys matching! 
    delete @{$this}{ @results };
}

1;

__END__