无法理解perl正则表达式以取消引用元

时间:2014-07-04 23:24:51

标签: regex perl

我遇到了这个令人敬畏的正则表达式:

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

2 个答案:

答案 0 :(得分:1)

在Perl的情况下,你有单引号和双引号,其中" $ foo"扩大了' $ foo'字面意思。

q运算符可让您设置'哪个字符 qq运算符设置"的字符。

所以在很棒的例子中,[设置为扩展变量,而perl magic通过将][配对来使其更具可读性。因此,它将变量扩展两次,如果没有突出显示将是非常神秘的,并且"引号在与shell引用混合时会变得非常混乱。

一个简单的例子:

% perl -E '$foo=bar; say qq[$foo];'
bar
% 

答案 1 :(得分:1)

qq是插值报价运算符。它与在双引号之间放置字符串相同,但可以在此处使用开放式字符对,如[]。这样做的好处是你可以嵌套它,你不能用双引号。