2011-02-09 62 views
2

可能重复:
How do I perform a Perl substitution on a string while keeping the original?在Perl中是否有类似Ruby的gsub方法?

我怎样做一个管线的更换在Perl,而无需修改字符串本身?我也希望它能够在表达式中使用,就像我在Ruby中可以使用p s.gsub(/from/, 'to')一样。

所有我能想到的是

do {my $r = $s; $r =~ s/from/to/; $r} 

,但肯定有一个更好的办法?

+0

@ephemient =>链接的问题不包括使用替代作为子表达 – 2011-02-09 02:21:02

+2

@Eric:当然可以。其中一个答案在Perl 5.13.2中提到了新的`/ r`选项(它将使其成为Perl 5.14)。 – ephemient 2011-02-09 04:25:56

回答

4

你发现do的解决方案是不坏,但可以缩短一点:

do {(my $r = $s) =~ s/from/to/; $r} 

它仍然揭示了力学。您可以隐藏实现,并通过编写子例程将替代应用于列表。在大多数实现中,此函数被称为apply,您可以从List::GenList::MoreUtils或其他许多模块导入。还是因为它是如此之短,只是把它写自己:

sub apply (&@) {     # takes code block `&` and list `@` 
    my ($sub, @ret) = @_;   # shallow copy of argument list 
    $sub->() for @ret;   # apply code to each copy 
    wantarray ? @ret : pop @ret # list in list context, last elem in scalar 
} 

apply创建参数列表中的浅表副本,然后调用它的代码块,预计将修改$_。块的返回值不被使用。 apply表现得像逗号,运营商。在列表上下文中,它返回列表。在标量上下文中,它返回列表中的最后一个项目。

要使用它:

my $new = apply {s/foo/bar/} $old; 

my @new = apply {s/foo/bar/} qw(foot fool fooz); 
3

Perl's docs: Regexp-like operators

($foo = $bar) =~ s/this/that/g; # copy first, then change将匹配gsub,而 $bar =~ s/this/that/g; # change将匹配gsub!

+0

它不会给我回串,所以它不能在表达式中使用。 – vava 2011-02-09 01:46:36

+0

如果在标量上下文中使用,则逗号后跟var:`...,$ foo`将会这样做 – 2011-02-09 01:51:19

10

开始的一天,你在所有的程序的顶部手感舒适写作use 5.14.0,您可以使用s/foo/bar/r变体s///操作的,它返回改变的字符串,而不是修改原来的位置(添加在perl 5.13.2中)。

相关问题