如何在Perl中替换后使用匹配变量$ 1?

时间:2010-04-13 21:46:38

标签: perl

从Perl中的替换中获取匹配变量的最简洁方法是什么? 我有时会发现自己写作

    s/(something)// ;
    my $x = $1 ;

然后我意识到,如果s/ / /失败$1可能会携带前一场比赛的值。所以我试试

    my  $x = 'defaultvalue' ;
    if ( s/(something)// )
    {
     $x = $1 ;
    }

这是最干净的方法吗?

4 个答案:

答案 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的优先级低于&&,因此可以删除作业周围的括号。

来自perldoc perlop

  
    

作为用于控制流的&&||的更具可读性的替代方案,Perl提供了andor运算符(见下文)。短路行为是相同的。但是,“和”和“或”的优先级要低得多,这样您就可以在列表运算符之后安全地使用它们而无需使用括号:

  

答案 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;