我知道=~ s/(.)\s/$1/seg
用空格替换额外的分隔空格但$1
和seg
的含义是什么?
答案 0 :(得分:5)
这是一些删除空格的尝试,虽然它有点不规则,我不确定这是否是故意的。
s/(.) # match a single character, capture string into $1
\s # match a single whitespace
/ # replace with
$1 # the captured string from above
/seg # use these modifiers on the substitution
s
更改通配符.
的行为以匹配换行符e
导致替换被评估为Perl代码。在这种情况下,它没有任何效果,因为它只是将字符串eval为字符串。g
表示全局,表示匹配执行次数最多,而不是一次,这是默认值。此替换的行为是删除单个空格,这可能是尝试将字符串a foo bar
转换为afoobar
。但是,在多个连续空格的情况下,它将只删除所有其他空格,因为.
将匹配空格。因此a foo bar
将成为afoo bar
。为了解决这个问题,可以在\s
字符类中添加一个量词,并允许它多次匹配:\s+
。
但是,如果我们这样做,我们不妨跳过检查.
并执行s/\s+//g
。如果目的是仅删除非空格后面的空格,则使用\S
(非空格)而非.
更为谨慎,如下所示:s/(\S)\s/$1/sg
。
正如我所说,这是一个有点奇怪的替代。
答案 1 :(得分:3)
$1
指的是第一个捕获组。它将是(.)
匹配的任何内容。
seg
是一堆正则表达式标志:
s
将输入视为s
ingle行。它告诉.
也匹配\n
(它通常不会)。e
将替换模式视为Perl e
xpression。由于s//
已经了解$1
。g
意味着以g
形式替换它(即:它出现在字符串中的任何地方,而不是第一次出现)。