从Perl中的替换中获取匹配变量的最简洁方法是什么? 我有时会发现自己写作
s/(something)// ;
my $x = $1 ;
然后我意识到,如果s/ / /
失败$1
可能会携带前一场比赛的值。所以我试试
my $x = 'defaultvalue' ;
if ( s/(something)// )
{
$x = $1 ;
}
这是最干净的方法吗?
答案 0 :(得分:4)
TMTOWTDI。
通常看到的惯用Perl可能类似于:
my $x='defaultvalue';
$x=$1 if (s/(something)//) ;
答案 1 :(得分:2)
正如其他人所指出的那样,TIMTOWTDI。
我个人将它作为单个表达式包装起来,以免过分分散注意力:
my $x = s/(something)// ? $1 : 'defaultvalue';
答案 2 :(得分:1)
@mobrule在评论中指出你可以使用
s{(...)}{} && ($x=$1)
我会推荐
s{(...)}{} and $x = $1;
我使用了s{}{}
,因为当Markdown将//
标记为Perl代码中的注释时,我讨厌它。
and
的优先级低于&&
,因此可以删除作业周围的括号。
作为用于控制流的
&&
和||
的更具可读性的替代方案,Perl提供了and
和or
运算符(见下文)。短路行为是相同的。但是,“和”和“或”的优先级要低得多,这样您就可以在列表运算符之后安全地使用它们而无需使用括号:
答案 3 :(得分:1)
这是非常主观的,最好的答案在很大程度上取决于它与你的编码风格的匹配程度,但无论如何我都会戴上帽子。
我最喜欢的默认分配是第三级运算符:
my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue';
虽然新的(好的,不是那个新的,5.10引入它)“定义或”运算符在很多情况下可以减少对三级语句的需求。我通常这样使用它:
my $var = defined($candidate) ? $candidate : 'default';
但现在可以简化为:
my $var = $candidate // 'default';
或
my $var = 'default';
$var //= $candidate;