Perl字符串子

时间:2010-06-24 23:15:40

标签: perl

我想用C:\foo之类的路径替换某些东西,所以我:

s/hello/c:\foo

但这是无效的。 我是否需要逃避一些角色?

3 个答案:

答案 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/;

可以解决您的问题。 \是一个特殊角色,所以你需要逃脱它。 {}[]()^$.|*+?\是您需要转义的元(特殊)字符。

其他参考:http://perldoc.perl.org/perlretut.html