in reply to Regex question

You're being too specific. Your goal is simply to get the last thing between two slashes.

my ($dir) = m{/([^/]+)/[^/]*$};

Notice I changed the regexp's delimiters so I didn't have to escape the slashes.

I removed the if. That will set $dir to undef on failure. Add the if back if you want to keep $dir's previous value on failure.

Technically, you could omit the leading slash from the regexp, but I think it'll be more efficient with it.

Update: Since you mentioned you wanted to study my regexp further, what follows might help. Read from the comments from the bottom up.

my ($dir) = m{ / # Preceeded by a slash. ([^/]+) # Preceeded by non-slashes, the dir. Captured. / # Preceeded by a slash. [^/]* # Preceeded by non-slashes, the file name. $ # End of string. }x;

Update: Oops! I forgot the parens around $dir. Added.

Replies are listed 'Best First'.
Re^2: Regex question
by Roy Johnson (Monsignor) on Aug 19, 2005 at 03:12 UTC
    Could also be done
    m{.*/(.*)/}

    Caution: Contents may have been coded under pressure.

      Or, to mirror the constraints in the OP's regex:

      m{^.* / ([\w-]+) / .*\.txt}x

      Also, the form:

      my $dir; $dir = $1 if ##regex_here##

      is a good idiom to become familiar with.

      Updates:

      • 2005-08.Aug-22 : fixed short-sighted error tlm points out below. I keep getting bit on that. ;-)

      <-radiant.matrix->
      Larry Wall is Yoda: there is no try{} (ok, except in Perl6; way to ruin a joke, Larry! ;P)
      The Code that can be seen is not the true Code
      "In any sufficiently large group of people, most are idiots" - Kaa's Law

        Also, the form:

        my $dir = $1 if ##regex_here##

        is a good idiom to become familiar with.

        Not with my, though. The behavior of my ... if ...; is undefined.

        the lowliest monk