perl 正则表达式替换

perl regular expressions substitue

我是 perl 的新手,我发现这个表达式有点难以理解

$a =~ s/\'/\'\"\'\"\'/g

谁能帮我理解这段代码的作用?

这段代码将每个引号替换为 '"'"'

里面的\都是无用的(但无害),所以相当于s/'/'"'"'/g。它将字符串中的每个 ' 替换为 '"'"'

这通常用于 shell 引用。例如参见 [​​=14=]

不清楚是哪一部分有问题。下面分别简单介绍一下。

表达式 $str =~ s/pattern/replacement/ 是一个 正则表达式 ,用 "pattern" 替换字符串 $str 匹配的部分"replacement"。在末尾使用 /g 时,它会对字符串中找到的 "pattern" 的所有实例执行此操作。它的意义远不止于此——请参阅 tutorial, a quick start, the reference, and full information in perlre and perlop.

有些字符有特殊含义,特别是在 "pattern" 中使用时。一个常见的集合是 .^$*+?()[{\|,但这取决于正则表达式的 flavor。此外,用作定界符的任何内容(通常为 /)也必须转义。请参阅文档,例如 this post. If you want to use any one of those characters as a literal character to be found in the string, they have to be escaped by the backslash. (Also see about escaped sequences。)在您的示例中,' 被转义,用作替换的字符也是如此。

问题是,这些其实不需要转义。所以这有效

use strict;
use warnings;

my $str = "a'b'c";
$str =~ s/'/'"'/g;
print "$str\n";

它打印所需的 a'"'b'"'c。请注意,您仍然 可以 逃避它们并且它会起作用。 ' 确实非常特殊的一种情况是在 one liner 中,它将通过 shell 提交给 Perl 的整段代码定界为 运行。 (但是,仅仅在那里转义它是行不通的。)总而言之,您显示的表达式会像 Jens 的答案一样进行替换,但不需要扭曲。

关于相关功能的说明:您几乎可以使用任何东西作为分隔符,不一定只是 /。所以这个 |patt|repl| 很好,甚至这样也很好: {patt}{repl} (除非它们在内部使用)。这有时非常方便,大大提高了可读性。一方面,您不必在正则表达式中转义 / 本身。

希望对您有所帮助。

可以通过删除不必要的反斜杠来简化 $a =~ s/'/"'"'/g

我们将用“'”'替换每个'