in reply to Need to capture an optional sub-directory name
A nice module like File::Spec or Path::Class will probably save you some head-hurt, but here's a possible regex approach (needs 5.10+ for \K):
>perl -wMstrict -le "my @paths = qw( C:\Tools\scripts\Test\Foo.pl C:\Tools\Test\Unstable\Foo.pl C:\Tools\scripts\Test\Bar.dir\Baz\Foo.pl C:\Tools\Test\Baz\Test\Foo.pl ); ;; my $all_before_Test = qr{ \A (?: (?! \\ Test) .)* }xms; ;; for my $path (@paths) { print qq{'$path'}; my @chunks = $path =~ m{ (?: $all_before_Test | \G) \\ \K [^\\]+ }xmsg; $chunks[-1] =~ s{ [.] [^.]* \z }{}xms; my $msg = join q{ - }, @chunks; print qq{'$msg' \n}; } " 'C:\Tools\scripts\Test\Foo.pl' 'Test - Foo' 'C:\Tools\Test\Unstable\Foo.pl' 'Test - Unstable - Foo' 'C:\Tools\scripts\Test\Bar.dir\Baz\Foo.pl' 'Test - Bar.dir - Baz - Foo' 'C:\Tools\Test\Baz\Test\Foo.pl' 'Test - Baz - Test - Foo'
If you want 'C:\Tools\Test\Baz\Test\Foo.pl' to render as 'Test - Foo' use
my $all_before_Test = qr{ \A .* (?= \\ Test) }xms;
instead.
|
|---|