我想在perl中使用正则表达式删除文件的完整路径的第一部分。但是在路径中使用反斜杠时它不起作用。考虑下面的test.pl
$fileName = 'C:\someDirectory\anotherDirectory\someFile.txt';
$dirName = 'C:\someDirectory';
print "$fileName\n";
$fileName =~ s/$dirName//;
print "$fileName\n";
$fileName = 'C:#someDirectory#anotherDirectory#someFile.txt';
$dirName = 'C:#someDirectory';
print "$fileName\n";
$fileName =~ s/$dirName//;
print "$fileName\n";
输出如下:
C:\someDirectory\anotherDirectory\someFile.txt
C:\someDirectory\anotherDirectory\someFile.txt
C:#someDirectory#anotherDirectory#someFile.txt
#anotherDirectory#someFile.txt
为什么反斜杠在字符串中时替换不起作用?我怎么能绕过这个?
答案 0 :(得分:1)
反斜杠是一个正则表达式特殊字符,因此如果它打算作为正则表达式中文字字符串的一部分,则必须对其进行转义。
为此,您只需使用quotemeta
或\Q...\E
转义序列:
my $fileName = 'C:\someDirectory\anotherDirectory\someFile.txt';
my $dirName = 'C:\someDirectory';
print "$fileName\n";
$fileName =~ s/\Q$dirName\E//;
print "$fileName\n";
输出:
C:\someDirectory\anotherDirectory\someFile.txt
\anotherDirectory\someFile.txt
或者,您可以使用Path::Class
之类的模块进行跨平台兼容的文件和目录操作。
以下是您执行的相同目标:
use Path::Class;
my $file = file('C:\someDirectory\anotherDirectory\someFile.txt');
my $dir = dir('C:\someDirectory');
my $rel = $file->relative($dir);
print "$rel\n";
输出:
anotherDirectory\someFile.txt