collywobble has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, I'm newbie to perl and am trying to do a pattern match so would appreciate 2/3 mins of someones time to help me out. if ($ARGV[0] =~ /^ep_svr_(\d)_([A-Za-z]{3})_([A-Za-z]{3})_(\w)/) the actual string is  ep_svr_<any number>_<3 letters>_<3 letters>_<any character> thanks

Replies are listed 'Best First'.
Re: Pattern Match
by broquaint (Abbot) on Feb 04, 2003 at 15:59 UTC
    ep_svr_<any number>_<3 letters>_<3 letters>_<any character>
    How aboot
    my @strs = qw( ep_svr_1_abc_ZYX_! ep_svr_2_DEF_wvu_? ep_svr_3_GhI_tSr_# ep_svr_x_aaa_bbb__ xep_svr_2_ccc_ddd_x ep_svr_4_ee_ffff_y ); for(@strs) { print m< ^ ep_svr_ \d _ [A-Za-z]{3} _ [A-Za-z]{3} _ . \z >xi ? "valid pattern: $_\n" : "invalid pattern: $_\n"; } __output__ valid pattern: ep_svr_1_abc_ZYX_! valid pattern: ep_svr_2_DEF_wvu_? valid pattern: ep_svr_3_GhI_tSr_# invalid pattern: ep_svr_x_aaa_bbb__ invalid pattern: xep_svr_2_ccc_ddd_x invalid pattern: ep_svr_4_ee_ffff_y
    There I'm using the /x modifier so whitespace doesn't effect the regex, non-standard delimiters (just personal preference) and \z to specify the end of the string (not the end of the line). See perlre and perlop for more info.
    HTH

    _________
    broquaint

      m< ^ ep_svr_ \d _ [A-Za-z]{3} _ [A-Za-z]{3} _ \S \z >xi
      Presumably something on the end other than whitespace.

      However, broquaint gets the kudos.

      Updated: I'm the idiot that doesn't know plural forms of words like character!

Re: Pattern Match
by tall_man (Parson) on Feb 04, 2003 at 16:13 UTC
    I assume that what you call the "actual string" is a description of the pattern you would like to match. What you have is not bad, but you could do the following (used the "x" option to add spaces and comments for readability):
    if ($ARGV[0] =~ /^ep_svr_ (\d) # any single-digit number -- use (\d+) for + multi-digits _([A-Za-z]{3}) # three letters _([A-Za-z]{3}) # three letters _(\w) # any "word" character -- use (.) for any c +haracter \z # if you want to anchor the end /x) { print "matched ",$ARGV[0],"\n"; my ($num,$alpha1,$alpha2,$char) = ($1,$2,$3,$4); # Do something with the captured parts here... }
    Update: I made use of your capturing parentheses -- otherwise there is no need to use them.
      Thanks - I appreciate it