in reply to hash key regular expression pattern

You could run through the keys and do a pattern match on each one, like:

my %cat = ('something' => 'stuff',); my $variable = 'something'; my $match; while (my ($key, $value) = each %cat) { if ($variable =~ /$key/) { $match = $value and last; } }

Unfortunately this really nullifies the primary usefullness of a hash, e.g., efficient and straightforward dictionary lookup. What would be a better solution, if you can change the manner in which you store your data, is to use Tie::Hash::Regex, which enables you to use a regular expression to do key lookups. Very spiffy IMO, and written by a couple of local monks too.

Update: fixed two typos in the code snippet.

Replies are listed 'Best First'.
Re: Re: hash key regular expression pattern
by BrowserUk (Patriarch) on Nov 07, 2002 at 10:04 UTC

    Isn't that just pushing the loop under the covers. Or is there some benefit I am missing here?


    Nah! You're thinking of Simon Templar, originally played (on UKTV) by Roger Moore and later by Ian Ogilvy

      Isn't using the Tie::Hash::Regex module just pushing the loop under the covers? I dunno, I didn't write it, although if it's a pure Perl module then I would suspect that's how it is implemented. Personally I'd like to see that functionality available in perl itself rather than as a tie'd module, though more for speed than for convenience. After all, a standard hash lookup is remarkably faster than a foreach over a hash (or at least it was last time I compared the two methods with a tie'd DBM of about 50,000 entries).

      Update: a brief perusal of the code shows a combination in the FETCH subroutine of for and qr to prevent recompilation of the regex. The real meat of the code is:

      my $key = qr/$key/; /$key/ and return $self->{$_} for keys %$self;