I understand the question and the problem you found, but I feel like it is a sign you are using the wrong tool for the job. Not only does perl understand both forward ('/') and back ('\') slashes as path separators on most platforms (and you don't have to escape them if you use single-quotes, by the way), but it includes File::Spec::Win32 in the core, which appears to be in perl on multiple platforms. (I checked and it appears to be present on the Windows/Strawberry, Windows/Cygwin, and Linux/Fedora systems I checked with perl installed.) File::Basename is another core module that can separate file names and paths, to might allow you to work on just the piece you want (but I haven't thought through that one in this case).
I know your code is a simple example (and thus may not reflect *WHY* you are trying to do this), but consider the following code to do something similar.
# File::Spec::Win32 example
#
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec::Win32;
my @txt = ( 'C:\Book\C0001-Chapter-001.mp3', );
my @re = (
[ qr{^(C\d+)}msx => '"NEW-$1"', ],
[ qr{(-Ch)}msx => 'lc("$1")', ],
);
foreach my $fn ( @text ) {
print qq{Before: }, $fn, qq{\n};
#
# @fp - file parts (volume, directory, filename)
# @dl - directory path to $fn
my @fp = File::Spec::Win32->splitpath( $fn );
my @dl = File::Spec::Win32->splitdir( $fp[1] );
#
# Apply regexes to file name
# (could also add logic to modify some part of the
# directory path in @dl as well).
foreach my $regex ( @re ) {
$fp[3] =~ s/$regex->[0]/$regex->[1]/gee;
}
#
# Rebuild file name
$fp[1] = File::Spec::Win32->catdir( @dl );
my $ffn = File::Spec::Win32->catpath( @fp );
print qq{After: }, $ffn, qq{\n};
}
#
# Output:
#
# Before: C:\Book\C000-Chapter-001.mp3
# After: C:\Book\NEW-C000-chapter-001.mp3
Hope that helps.