$cmd =~ s@-fp [^ ]+@@;
有没有人让我知道这个正则表达式在Perl中意味着什么? 我通过谷歌搜索找不到上面的任何正则表达式......
答案 0 :(得分:5)
这将从命令中删除-fp
可选参数及其值。
这将采用变量$cmd
存储的字符串,并替换匹配-fp [^ ]+
的部分。
此命令使用Perl替换(或其他正则表达式修饰符)可以具有任何分隔符的事实。通常写为s/.../.../
的内容是s@...@...@
。这可能是混乱的根源。
=~
是binary binding operator,它将左参数作为字符串来执行右参数参数,在本例中为替换。
-fp [^ ]+
-fp
字面上匹配。[^ ]+
匹配一个或多个不是空格的字符。答案 1 :(得分:0)
让我们先轻松一点。 $cmd =~
只是表示“对变量$cmd
进行替换。”
并非所有这个表达式都是正则表达式。它实际上是替换运算符 - s/REGEX/STRING/
。它匹配REGEX并将其替换为STRING。
与Perl中的许多类似运算符一样,替换运算符允许您选择使用的分隔符。在这种情况下,程序员使用@
进行了一些奇怪的选择。
所以,我们有这个:
$cmd =~ s/-fp [^ ]+//;
我们现在知道这意味着。 “将变量$cmd
与正则表达式-fp [^ ]+
匹配,并将其替换为空字符串”。为什么空字符串?因为替换字符串位(在第二个和第三个/
之间)是一个空字符串。
我们现在需要做的就是了解实际的正则表达式 - -fp [^ ]+
。而且它并不复杂。
-fp
- 前四个字符(最多包括空格)与自己匹配。所以这匹配文字字符串“-fp”。[^ ]
- 这是一个“角色类”。通常,它表示“匹配[...]
内的任何字符”。但是^
开头的反转意味着“匹配任何字符期望 [^...]
之间的字符。所以这匹配任何不是空格的东西。+
- 这是一个修饰符,表示“匹配前一个表达式中的一个或多个”。所以,放在一起,这是“匹配字符串'-fp'后跟一个或多个非空格字符。
并且,在表达式的其余部分添加,我们得到:
查看
$cmd
中的字符串,如果找到字符串'-fp - '后跟一个或多个非空格字符,则用空字符串替换匹配的部分。