Perl字符串子例程

4

我想用类似 C:\foo 的路径替换某些内容,所以我:

s/hello/c:\foo

但是这是无效的。 我需要转义一些字符吗?


当我看到这个问题的标题(“Perl 字符串子”)时,我还以为这将是一个关于通过符号表查找动态调用 子例程 的问题。 :) - pilcrow
3个回答

5
我看到两个问题。
您的第一个问题是您的替换没有终止:
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中关于引用和类似引用操作符的处理方式,以获取更多信息。


2
如果我理解你的问题,那么这可能是你想要的东西:
$path = "hello/there";
$path =~ s/hello/c:\\foo/;
print "$path\n";

回答你的问题,是的,你需要双反斜杠,因为在Perl字符串中\f是“换页符”的转义序列。

1
最后一句话是错误的,实际上\f是一个有效的转义序列,用于换页符 - daxim
真的,固定的。换页符不是我经常使用的! - Greg Hewgill

1
问题在于您没有转义特殊字符:
s/hello/c:\\foo/;

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

附加参考资料:http://perldoc.perl.org/perlretut.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接