我正在使用未注释的perl代码。我遇到了一段文章,对于我来说,作为一个perl初学者看起来太过分了。这是一个简化的适应:
my $foo;
my $bar = "x|y|z|";
$bar =~ s{\|$}{};
($foo = $bar) =~ s{ }{}gs;
我了解$bar =~ s{\|$}{}
将右边的正则表达式应用于$bar
内的字符串。
但表达式($foo = $bar) =~ s{ }{}gs;
是什么意思?我不是在询问正则表达式,而是询问它所表达的表达式。
答案 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
和$b
是sort
使用的预先声明的变量,您应该避免使用它们。
如有疑问,您可以随时打印变量并查看变量。例如:
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
正则表达式,{}
作为分隔符