我遇到了这个令人敬畏的正则表达式:
s/((?:\\[a-zA-Z\\])+)/qq[qq[$1]]/eeg
它确实很神奇,但却是如此模糊,我无法理解它。它运作得很好:
echo 'a\tb\nc\r\n' | perl -lpe 's/((?:\\[a-zA-Z\\])+)/qq[qq[$1]]/eeg'
a b
c
让我们看一下cat -A
:
echo 'a\tb\nc\r\n' | perl -lpe 's/((?:\\[a-zA-Z\\])+)/qq[qq[$1]]/eeg' | cat -A
a^Ib$
c^M$
$
我会保留它以供将来参考,但理解它真的很酷。我知道/ee
修饰符会评估RHS
,但那些qq
是什么?双引号的函数qq
是什么?如果有人能解释,我将不胜感激。
PS。我发现了这个正则表达式here
答案 0 :(得分:1)
在Perl的情况下,你有单引号和双引号,其中" $ foo"扩大了' $ foo'字面意思。
q
运算符可让您设置'
哪个字符
qq
运算符设置"
的字符。
所以在很棒的例子中,[
设置为扩展变量,而perl magic通过将]
与[
配对来使其更具可读性。因此,它将变量扩展两次,如果没有突出显示将是非常神秘的,并且"
引号在与shell引用混合时会变得非常混乱。
一个简单的例子:
% perl -E '$foo=bar; say qq[$foo];'
bar
%
答案 1 :(得分:1)
qq
是插值报价运算符。它与在双引号之间放置字符串相同,但可以在此处使用开放式字符对,如[]
。这样做的好处是你可以嵌套它,你不能用双引号。