There is a much simpler way of getting the path and the filename -

use File::Basename;

my ($rfile, $dirname) = fileparse($roriginal_file); # split up the file name

works very well.

randy

"Brian Gerard" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> And the clouds parted, and Kevin Pfeiffer said...
> > >
> > > Here's a line that will give you exactly that.
> > > ($PROGNAME = $0) =~ s|(\.?\.?(/[^/]+)*/)?([^/]+)|$3|;
> >
> > I have two questions...
> >
> > I came up with this earlier today:
> > my ($program) = $0 =~ /([^\/]+)$/;
> >
> > Doesn't it do the same? (Question 1)
>
> Sure looks that way, yes.  :)  I realized after you posted your (much,
> _much_) simpler regex that the reason mine was so convoluted was that
> the script I was using it in originally needed to capture the path the
> script was invoked with as well as the script name.  For just the script
> name your solution should perform admirably.
>
> > If I don't escape the slash in the char class -- i.e. /([^\/]+)$/ -- I
get
> > this error:
> > Unmatched [ in regex; marked by <-- HERE in m/([ <-- HERE ^/ at ./test-0
> > line 7.
> >
> > This makes no sense to me (since this is Perl and not sed or
something)...
> > (implied Question 2)
>
> The reason is that you're using '/' as the delimiter for the m// operator,
> and '/' isn't automatically escaped in a character class (it's not a
> metacharacter).  I got away with it because I was using '|' as the
delimiter
> in my substitution.
>
> What I mean is this.  Talking about the m// and s/// operators, you can
> use just about anything in place of the '/'s. (We won't discuss using the
> 'x' option to m// and s///, for the sake of brevity and simplicity.)
>
> m/pattern/  #is the same as
> m;pattern;  #which is the same as
> m|pattern|
>
> and
> s/pattern/replacement/  #is equivalent to
> s#pattern#replacement#
> ...or even...
> s{pattern}{replacement}
> ...but I digress.  :)
>
> So to avoid what the Camel Book refers to as 'leaning toothpick syndrome'
> when matching unix pathnames, I use a delimiter other than '/' so that I
> don't have to always type '\/' when I want to match a slash in the path.
>
> As for why it wouldn't lose its "specialness" inside of a character class,
> that only applies to regex metacharacters ('.', '*', '+', etc).  When perl
> looks for the pattern to match it looks for everything up to the first
> matching delimiter before trying to compile it.  So when you said
> m/([^/]+)$/
> perl tried to use
> ([^
> as its regex, which isn't valid.  That's why it was complaining about an
> unmatched [.  It only saw one.  :)
>
> HTH-
> Brian
>
>
>   /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
>  | Brian Gerard                      "I am Pooh of Borg. Bother is
|
>  | First initial + 'lists'        futile; hunny will be assimilated."
|
>  | at technobrat dot com
|
>   \______________________________________________________________________/



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to