赋值的模式绑定运算符

时间:2013-09-26 13:35:11

标签: regex perl

我正在使用未注释的perl代码。我遇到了一段文章,对于我来说,作为一个perl初学者看起来太过分了。这是一个简化的适应:

my $foo;
my $bar = "x|y|z|";

$bar =~ s{\|$}{};
($foo = $bar) =~ s{ }{}gs;

我了解$bar =~ s{\|$}{}将右边的正则表达式应用于$bar内的字符串。 但表达式($foo = $bar) =~ s{ }{}gs;是什么意思?我不是在询问正则表达式,而是询问它所表达的表达式。

3 个答案:

答案 0 :(得分:5)

只需遵循括号所指示的优先顺序并在当时解决每个语句:

($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$bsort使用的预先声明的变量,您应该避免使用它们。

如有疑问,您可以随时打印变量并查看变量。例如:

use Data::Dumper;
my $x = 'foo bar';
(my $y = $x) =~ s{ }{}gs;
print Dumper $x, $y;

<强>输出:

$VAR1 = 'foo bar';
$VAR2 = 'foobar';

答案 1 :(得分:4)

标量上下文中的标量赋值返回其左侧操作数(如图here所示)。这意味着

$a = $b

$b的值分配给$a并返回$a。这意味着

($a = $b) =~ s{ }{}gs;

的缩写
$a = $b; $a =~ s{ }{}gs;

并且渴望

$a = $b =~ s{ }{}gsr;  # Requires 5.14+

答案 2 :(得分:1)

  

但是表达式是什么($ a = $ b)= ~s {} {} gs;意思?

相同
$a = $b;
$a =~ s{ }{}gs;

s{ }{}gs是替换s/ //gs正则表达式,{}作为分隔符