sub my_sub {
my $str = shift;
$str =~ s/some/regex/;
return $str;
}
对于这样一个简单的子程序,五行似乎太长了。是否可以简化,例如不使用中间变量?
sub my_sub {
my $str = shift;
$str =~ s/some/regex/;
return $str;
}
对于这样一个简单的子程序,五行似乎太长了。是否可以简化,例如不使用中间变量?
没有中间变量和缩短一行:
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;
}
sub my_sub {
(my $str = shift) =~ s/some/regex/;
$str;
}
这对于简单的替换来说并不长。它还创建数据的副本,替换该副本,并返回修改后的副本,同时保留原始副本。所以,你会像这样使用它:
my $modified = my_sub( $original );
一些答案适用$_[0]
于@_
. 这是原始数据的别名。这样,Perl 不必复制数据,直到它知道您确实需要一个单独的副本。当您对别名进行替换时,您修改了原始名称。这样做更像是更改原始文件并重新分配给它:
$original = my_sub( $original );
但是,您提出的问题是使其更短。这通常不是做任何事情的充分理由。这是一个子程序,所以只要它满足您的要求,就让它随心所欲。在设计此类代码之前,请弄清楚您的需求是什么。