Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Testing for the presence of a hash key in a filename

by Fletch (Bishop)
on May 25, 2007 at 14:49 UTC ( [id://617505]=note: print w/replies, xml ) Need Help??


in reply to Testing for the presence of a hash key in a filename

One approach:

  • Make a hash with the keys being the abbreviations and the values the corresponding logo
  • Use Regexp::Assemble to build up a regular expression from the keys of your hash which will capture the abbreviation
  • Use that constructed regex against your filenames and then use $1 to key your hash lookup

I'm presuming this is some sort of HTML output and it's something like the path to an image. If you actually needed to munge the filename in some way the vaules in the hash could be coderefs instead which implement whatever particular substitution or other mungery you need.

Replies are listed 'Best First'.
Re^2: Testing for the presence of a hash key in a filename
by Ojosh!ro (Beadle) on May 25, 2007 at 16:09 UTC

    It's basically what I'd do too. I'd just construct the regex myself I guess.
    Something along the lines of:
    my $match = '('.join( '|', sort keys %replace ).')'; and then use the value in $replace{$1}

    if( exists $aeons{strange} ){ die $death unless ( $death%2 ) }

      It appears from the problem description that the keys are all three characters, but just as a heads-up, you might want to add a reverse to that:

      my $match = '('.join('|', reverse sort keys %replace).')';

      The reverse ensures that the longest match is found even if some pattern is a prefix of another (which, in my experience, is generally the desired outcome). e.g.:

      #!/usr/bin/perl -l use strict; use warnings; my %replace = qw/pre 1 prefix 2/; my $norev = '('.join('|', sort keys %replace).')'; my $withrev = '('.join('|', reverse sort keys %replace).')'; while (<DATA>) { chomp; print "Line: $_"; print "norev <$1>" if /$norev/; print "w/rev <$1>" if /$withrev/; } __END__ This line contains prefix (which also matches 'pre')

      Should print:

      Line: This line contains prefix (which also matches 'pre') norev <pre> w/rev <prefix>

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2024-04-25 07:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found