Regex 赋值上的模式绑定运算符
我正在编写未注释的perl代码。我遇到了一篇文章,作为一个perl初学者,这篇文章看起来太perl化了。这是一个简化的自适应:Regex 赋值上的模式绑定运算符,regex,perl,Regex,Perl,我正在编写未注释的perl代码。我遇到了一篇文章,作为一个perl初学者,这篇文章看起来太perl化了。这是一个简化的自适应: my $foo; my $bar = "x|y|z|"; $bar =~ s{\|$}{}; ($foo = $bar) =~ s{ }{}gs; 我知道$bar=~s{\\$}{}将右侧的正则表达式应用于$bar中的字符串。 但是表达式($foo=$bar)=~s{}{}gs平均值?我不是问正则表达式,而是问它所应用的表达式。只需遵循括号规定的优先级,一次解决一条
my $foo;
my $bar = "x|y|z|";
$bar =~ s{\|$}{};
($foo = $bar) =~ s{ }{}gs;
我知道$bar=~s{\\$}{}
将右侧的正则表达式应用于$bar
中的字符串。
但是表达式
($foo=$bar)=~s{}{}gs代码>平均值?我不是问正则表达式,而是问它所应用的表达式。只需遵循括号规定的优先级,一次解决一条语句:
($a = $b) =~ s{ }{}gs;
#^^^^^^^^--- executed first
($a = $b) # set $a to the value contained in $b
$a =~ s{ }{}gs; # perform the regex on $a
/g
全局修饰符使正则表达式尽可能多地匹配,/s
修饰符使通配符
也匹配换行符(因此它现在真正匹配所有内容)。/s
修饰符对于这个正则表达式是多余的,因为其中没有通配符
请注意,$a
和$b
是排序所使用的预声明变量,您应该避免使用它们
当有疑问时,您可以随时打印变量并查看它们如何变化。例如:
use Data::Dumper;
my $x = 'foo bar';
(my $y = $x) =~ s{ }{}gs;
print Dumper $x, $y;
输出:
$VAR1 = 'foo bar';
$VAR2 = 'foobar';
但是表达式($a=$b)=~s{}{}gs;什么意思
与
$a = $b;
$a =~ s{ }{}gs;
s{}{}gs
是以{}
作为分隔符的替换s///gs
regex标量上下文中的标量赋值返回其左侧操作数(如图所示)。这意味着
$a = $b
($a = $b) =~ s{ }{}gs;
将$b
的值指定给$a
并返回$a
。这意味着
$a = $b
($a = $b) =~ s{ }{}gs;
是的缩写
$a = $b; $a =~ s{ }{}gs;
渴望
$a = $b =~ s{ }{}gsr; # Requires 5.14+
谢谢被深刻的答案宠坏了,所以像这样,我没想到通过观察变量是如何变化的,就能真正了解变量到底发生了什么。我的一位同事猜测“正则表达式是在$b
上执行的,但结果存储在$A
”这将产生相同的值,但我现在不知道,$b
被分配给$A
。有趣的是$b
(或$x
)保持不变。然而,这是一种Perl魔术,从来没有真正需要使用。我认为将语句一分为二更具可读性。将$a
和$b
作为“保留”变量的好处在于。在本例中,我只是为示例重命名了实际变量。由于您提供的示例,我接受了您的。感兴趣的用户应该阅读ikegami关于r-flag相关语法的回答。我知道/r
修饰符,但它需要Perl v5.14,虽然实用,但这只是一种方便。另外,它有点模糊,许多人可能会错过它并感到困惑。+1在$a=$b=~s{}{}gsr中为我指出了新的r标志代码>