我想用C:\foo
之类的路径替换某些东西,所以我:
s/hello/c:\foo
但这是无效的。 我是否需要逃避一些角色?
答案 0 :(得分:5)
我可以看到两个问题。
您的首要问题是您的s///
替换未终止:
s/hello/c:\foo # fatal syntax error: "Substitution replacement not terminated"
s/hello/c:\foo/ # syntactically okay
s!hello!c:\foo! # also okay, and more readable with backslashes (IMHO)
您提出的第二个问题是,\f
被视为表单提要转义序列(ASCII 0x0C),就像在双引号中一样,这不是你想要的。
您可以转义反斜杠,也可以让变量插值“隐藏”问题:
s!hello!c:\\foo! # This will do what you want. Note double backslash.
my $replacement = 'c:\foo' # N.B.: Using single quotes here, not double quotes
s!hello!$replacement!; # This also works
查看perlop
中 Quote和类似操作符的处理方法,了解更多信息。
答案 1 :(得分:2)
如果我理解你在问什么,那么这可能就像你所追求的那样:
$path = "hello/there";
$path =~ s/hello/c:\\foo/;
print "$path\n";
要回答你的问题,是的,你需要加倍反斜杠,因为\f
是Perl字符串中“换页”的转义序列。
答案 2 :(得分:1)
问题是你没有逃避特殊字符:
s/hello/c:\\foo/;
可以解决您的问题。 \
是一个特殊角色,所以你需要逃脱它。 {}[]()^$.|*+?\
是您需要转义的元(特殊)字符。