[英]How can I golf this Perl subroutine that does a substitution?
我在Perl中有以下子程序用“abc”替换字符串中的“xyz”:
sub mySubst {
my ($str) = @_;
$str =~ s|abc|xyz|ig;
return $str;
}
它有效,但对于Perl来说似乎太冗长了。 我怎样才能把它收紧?
你有什么好。
shift
也可以工作,但是更改@_(可能是也可能不是你想要的。) 有关PerlMonks的讨论关于转换vs @_你可能会感兴趣。 local $_ = shift;
或local ($_) = @_;
这不会增加太多。) return
时,我喜欢它。 这是一个温暖的模糊。 去吧。 我认为你走在正确的轨道上。
如果您正在寻找高尔夫,而不是生产代码。
use strict; ## Not really required ;)
use warnings; ## Not really required ;)
sub f{local$_=pop,s/foo/bar/ig;$_}
print f 'foobarbaz';
你可以写:
sub mySubst { (map { s|abc|xyz|ig; $_ } "$_[0]" )[0] }
但除非这是一个混淆的练习,否则我会说你有你的东西。 请记住,您没有为计算机编写程序。
这是我如何更惯用地渲染该子例程:
sub mySubst {
(my $str = shift) =~ s|abc|xyz|ig;
return $str;
}
我觉得太冗长的声音就像我不同意的那样混淆不够 。 至于收紧它,我建议采取以下措施:
sub replaceBeginningWithEnd {
my $text = shift;
return if not defined($text);
$text =~ s/abc/xyz/ig;
return $text;
}
没有人为此提供Perl成语。 这通过修改副本来复制原始代码的行为:
(my $new_str = $old_str) =~ s/abc/xyz/ig;
如果我不得不把它放到一个子程序中,我认为这对于这么简单的操作来说有点傻,我想那会是:
sub foo { (my $s = $_[0]) =~ s/abc/xyz/ig; $s }
但是,如果我这样做傻事,我就不会为它做一个命名的子程序。 我做了一个子程序来为我创建子程序,所以我不需要为每种可能的替换方式添加一个新的命名子:
sub make_sub {
my( $regex, $replacement ) = @_;
# season to taste with error checking
sub {
(my $s = $_[0]) =~ s/$regex/$replacement/ig; $s
};
}
my $replacer = make_sub( qr/abc/, 'xyz' );
my $new = $replacer->( $string );
什么是子? 就这样做吧
$str =~ s|abc|xyz|ig;
您可以省略return关键字:
sub mySubst {
my ($str) = @_;
$str =~ s|abc|xyz|ig;
$str;
}
也可以使用默认变量( $_
):
sub mySubst {
local $_ = shift; # or my starting from Perl 5.10
s|abc|xyz|ig;
$_;
}
为避免更改原件,您可以写
sub mySubst { map { (my $s=$_) =~ s|abc|xyz|ig; $s } @_ }
要么
sub mySubst { my @a = @_; map { s|abc|xyz|ig; $_ } @a }
或借用思南的答案,除了明确丢弃临时阵列:
sub mySubst { map { s|abc|xyz|ig; $_ } my(undef) = @_ }
但语法仍然有点吵。 因为它使用map
,所以一定要在列表上下文中调用它:
my($result) = mySubst $str; # NOT my $one = mySubst $str;
如果您希望主要使用单个参数调用mySubst
但想要处理一个或多个参数的情况,那么您可以编写
sub mySubst {
s|abc|xyz|ig for my @a = @_;
wantarray ? @a : $a[0];
}
但这又开始了口吃。
如果你要更新的参数本身,使用Perl的潜艇别名语义中记录perlsub :
数组
@_
是一个本地数组,但它的元素是实际标量参数的别名。 特别是,如果更新元素$_[0]
则更新相应的参数(如果不可更新,则会发生错误)。
所以你可以写
sub mySubst { $_[0] =~ s|abc|xyz|ig }
甚至
sub mySubst { map { s|abc|xyz|ig; $_ } @_ }
用法示例:
$str = "fooabcbar";
mySubst $str;
print $str, "\n";
输出:
fooxyzbar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.