SYNOPSIS

  use Tie::Hash::Regex;
  my %h;

  tie %h, 'Tie::Hash::Regex';

  $h{key}   = 'value';
  $h{key2}  = 'another value';
  $h{stuff} = 'something else';

  print $h{key};  # prints 'value'
  print $h{2};    # prints 'another value'
  print $h{'^s'}; # prints 'something else'

  print tied(%h)->FETCH(k); # prints 'value' and 'another value'

  delete $h{k};   # deletes $h{key} and $h{key2};

or (new! improved!)

my $h : Regex;

DESCRIPTION

Someone asked on Perlmonks if a hash could do fuzzy matches on keys - this is the result.

If there's no exact match on the key that you pass to the hash, then the key is treated as a regex and the first matching key is returned. You can force it to leap straight into the regex checking by passing a qr'ed regex into the hash like this:

my $val = $h{qr/key/};

\*(C`exists\*(C' and \*(C`delete\*(C' also do regex matching. In the case of \*(C`delete\*(C' all vlaues matching your regex key will be deleted from the hash.

One slightly strange thing. Obviously if you give a hash a regex key, then it's possible that more than one key will match (consider c<$h{qw/./}>). It might be nice to be able to do stuff like:

my @vals = $h{$pat};

to get all matching values back. Unfortuately, Perl knows that a given hash key can only ever return one value and so forces scalar context on the \*(C`FETCH\*(C' call when using the tied interface. You can get round this using the slightly less readable:

my @vals = tied(%h)->FETCH($pat);

\s-1ATTRIBUTE\s0 \s-1INTERFACE\s0

From version 0.06, you can use attributes to define your hash as being tied to Tie::Hash::Regex. You'll need to install the module Attribute::Handlers.

METHODS

\s-1FETCH\s0

Get a value from the hash. If there isn't an exact match try a regex match.

\s-1EXISTS\s0

See if a key exists in the hash. If there isn't an exact match try a regex match.

\s-1DELETE\s0

Delete a key from the hash. If there isn't an exact match try a regex match.

AUTHOR

Dave Cross <[email protected]>

Thanks to the Perlmonks <http://www.perlmonks.org> for the original idea and to Jeff \*(L"japhy\*(R" Pinyan for some useful code suggestions.

COPYRIGHT

Copyright (C) 2001-8, Magnum Solutions Ltd. All Rights Reserved.

LICENSE

This script is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

RELATED TO Tie::Hash::Regex…

perl\|(1).

perltie\|(1).

Tie::RegexpHash\|(1)