Regex 赋值上的模式绑定运算符

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平均值?我不是问正则表达式,而是问它所应用的表达式。只需遵循括号规定的优先级,一次解决一条

我正在编写未注释的perl代码。我遇到了一篇文章,作为一个perl初学者,这篇文章看起来太perl化了。这是一个简化的自适应:

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标志