1
sub my_sub {
    my $str = shift;
    $str =~ s/some/regex/;
    return $str;
}

对于这样一个简单的子程序,五行似乎太长了。是否可以简化,例如不使用中间变量?

4

3 回答 3

9

没有中间变量和缩短一行:

sub my_sub {
    $_[0] =~ s/some/regex/;
    return $_[0];
}

编辑:正如@pavel 所指出的,这将修改原始变量。

Perl 5.13.2 开始,有一个非破坏性修饰符/r(供参考,请参阅perlop),它不会修改正则表达式操作的变量 - 这也允许放弃另一行:

sub my_sub {
    return $_[0] =~ s/some/regex/r;
}
于 2012-08-26T12:14:15.520 回答
3
sub my_sub {
    (my $str = shift) =~ s/some/regex/;
    $str;
}
于 2012-08-26T13:28:03.257 回答
1

这对于简单的替换来说并不长。它还创建数据的副本,替换该副本,并返回修改后的副本,同时保留原始副本。所以,你会像这样使用它:

 my $modified = my_sub( $original );

一些答案适用$_[0]@_. 这是原始数据的别名。这样,Perl 不必复制数据,直到它知道您确实需要一个单独的副本。当您对别名进行替换时,您修改了原始名称。这样做更像是更改原始文件并重新分配给它:

 $original = my_sub( $original );

但是,您提出的问题是使其更短。这通常不是做任何事情的充分理由。这是一个子程序,所以只要它满足您的要求,就让它随心所欲。在设计此类代码之前,请弄清楚您的需求是什么。

于 2012-08-27T11:58:06.883 回答