What is the cleanest way of picking up a match variable from a substitution in Perl I sometimes find myself writing
s/(something)// ;
my $x = $1 ;
then I realise that if the s/ / /
fails $1
might b开发者_如何学JAVAe carrying over a value from a previous match. So I try
my $x = 'defaultvalue' ;
if ( s/(something)// )
{
$x = $1 ;
}
Is this the cleanest way of doing it?
TMTOWTDI.
The idiomatic Perl usually seen might be somthing like:
my $x='defaultvalue';
$x=$1 if (s/(something)//) ;
As others have pointed out, TIMTOWTDI.
I'd personnally wrap it up as a single expression, so as not to distract too much from the point:
my $x = s/(something)// ? $1 : 'defaultvalue';
@mobrule points out in comments that you can use
s{(...)}{} && ($x=$1)
I would recommend
s{(...)}{} and $x = $1;
I used s{}{}
because I hate it when Markdown marks //
as comments in Perl code.
and
has lower precedence than &&
which makes it possible to remove the parentheses around the assignment.
From perldoc perlop:
As more readable alternatives to
&&
and||
when used for control flow, Perl provides theand
andor
operators (see below). The short-circuit behavior is identical. The precedence of "and" and "or" is much lower, however, so that you can safely use them after a list operator without the need for parentheses:
This is highly subjective, and the best answer will depend greatly on how well it matches your coding style, but I'll throw my hat into the ring anyway.
My favorite for assignments with defaults is the tertiary operator:
my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue';
Although the new (well, not that new, 5.10 introduced it) "defined or" operator can reduce the need for the tertiary statement in many cases. I generally use it as such:
my $var = defined($candidate) ? $candidate : 'default';
But now that can be simplified to:
my $var = $candidate // 'default';
or
my $var = 'default';
$var //= $candidate;
精彩评论