Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pattern binding operator on assignment

Tags:

regex

perl

I am working into uncommented perl code. I came across a passage, that looks too perl-ish to me as a perl beginner. This is a simplified adaption:

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

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

I understand that $bar =~ s{\|$}{} applies the regular expression on the right to the string inside $bar. But what does the expression ($foo = $bar) =~ s{ }{}gs; mean? I am not asking about the regular expression but on the expression it is apllied to.

like image 337
Andre Avatar asked Feb 20 '26 14:02

Andre


1 Answers

Just follow the precedence that the parentheses dictate and solve each statement one at the time:

($a = $b) =~ s{ }{}gs;
#^^^^^^^^--- executed first
($a = $b)        # set $a to the value contained in $b
$a =~ s{ }{}gs;  # perform the regex on $a

The /g global modifier causes the regex to match as many times as possible, the /s modifier makes the wildcard . match newline as well (so it now really matches everything). The /s modifier is redundant for this regex, since there are no wildcards . in it.

Note that $a and $b are predeclared variables which are used by sort, and you should avoid using them.

When in doubt, you can always print the variables and see how they change. For example:

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

Output:

$VAR1 = 'foo bar';
$VAR2 = 'foobar';
like image 181
TLP Avatar answered Feb 22 '26 07:02

TLP



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!