【发布时间】:2016-05-15 21:47:32
【问题描述】:
我是 perl 新手,我发现这个表达式有点难以理解
$a =~ s/\'/\'\"\'\"\'/g
谁能帮我理解这段代码的作用?
【问题讨论】:
-
可以写得更简单:
$a =~ s/'/'"'"'/g -
公平地说,根据所使用的字体,反斜杠可能有助于在视觉上分隔引号。
标签: regex perl substitution
我是 perl 新手,我发现这个表达式有点难以理解
$a =~ s/\'/\'\"\'\"\'/g
谁能帮我理解这段代码的作用?
【问题讨论】:
$a =~ s/'/'"'"'/g
标签: regex perl substitution
不清楚是哪一部分有问题。以下是对每一个的简要说明。
表达式$str =~ s/pattern/replacement/ 是一个正则表达式,将字符串$str 中与“模式”匹配的部分替换为“替换”。以/g 结尾,它对字符串中找到的“模式”的所有实例都这样做。它还有很多很多——请参阅tutorial、quick start、reference,以及perlre 和perlop 中的完整信息。
某些字符具有特殊含义,尤其是在“模式”中使用时。一个常见的集合是.^$*+?()[{\|,但这取决于正则表达式的风格。此外,用作分隔符的任何内容(通常为/)也必须转义。请参阅文档,例如 this post。如果您想将这些字符中的任何一个用作要在字符串中找到的文字字符,则它们必须被反斜杠转义。 (另请参阅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}(除非它们在内部使用)。这有时非常方便,大大提高了可读性。一方面,您不必在正则表达式中转义 / 本身。
我希望这会有所帮助。
【讨论】:
其中的所有\都是无用的(但无害的),所以它等价于s/'/'"'"'/g。它将字符串中的每个' 替换为'"'"'。
这通常用于 shell 引用。参见例如https://stackoverflow.com/a/24869016/17389
【讨论】:
这种代码的和平用'"'"'替换每一个引用
【讨论】:
可以通过删除不必要的反斜杠来简化 $a =~ s/'/"'"'/g
每一个 ' 都会被替换成 "'"'
【讨论】:
code 块中,以便它使用可变宽度字体,您可以立即看到为什么有人会输入不必要的反斜杠。因为您的答案中显示的内容几乎无法识别所有' 和" 像这样聚集在一起。