Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: hash key regular expression pattern

by djantzen (Priest)
on Nov 07, 2002 at 09:54 UTC ( [id://211032]=note: print w/replies, xml ) Need Help??


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;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://211032]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (2)
As of 2024-04-26 02:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found