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.
In reply to Re: Regex question
by ikegami
in thread Regex question
by cajun
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |