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
我们将用“'”'替换每个'
我是 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
我们将用“'”'替换每个'