3

我正在研究未注释的 perl 代码。我遇到了一个段落,对于我作为 perl 初学者的我来说,这看起来太 perl-ish。这是一个简化的改编:

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

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

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

4

3 回答 3

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';
于 2013-09-26T13:38:21.917 回答
4

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

$a = $b

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

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

简称

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

并渴望

$a = $b =~ s{ }{}gsr;  # Requires 5.14+
于 2013-09-26T13:41:53.400 回答
1

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

它与

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

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

于 2013-09-26T13:38:47.610 回答