如何对这个替换的Perl子程序进行高尔夫?

Joe*_*Fan 4 perl

我在Perl中有以下子程序用"abc"替换字符串中的"xyz":

sub mySubst {
    my ($str) = @_;
    $str =~ s|abc|xyz|ig;
    return $str;    
}
Run Code Online (Sandbox Code Playgroud)

它有效,但对于Perl来说似乎太冗长了.我怎样才能把它收紧?

Rob*_*t P 8

你有什么好.

  • 您使用列表赋值从@_变量中拉出参数,进行复制.列表赋值是一种很好的方法(基本上是标准方式.)使用shift也可以,但更改@_(可能或可能不是你想要的.) 有关于PerlMonks的讨论有关转移vs @_你可能感兴趣的.
  • 您在搜索和替换时使用命名变量.在这种情况下,我更喜欢命名变量,因为处理Perl的魔术变量需要注意.
  • 可以自动处理$ _,但是没有$ _自动填充会使得更难以正确使用.你需要做什么local $_ = shift;local ($_) = @_;哪些不会增加太多.)
  • 当人们使用显式时,我喜欢它return.这是一个温暖的模糊.
  • K&R Brackets.好.:)
  • 没有原型.很好.:)

去吧.我认为你走在正确的轨道上.

  • shift不会给你一个别名.它就像列表分配一样制作副本.只有在直接使用@_时才有别名 (3认同)

Eva*_*oll 6

如果您正在寻找高尔夫,而不是生产代码.

use strict;   ## Not really required ;)
use warnings; ## Not really required ;)
sub f{local$_=pop,s/foo/bar/ig;$_}
print f 'foobarbaz';
Run Code Online (Sandbox Code Playgroud)

  • 通过用pop替换shift来节省2 :) (2认同)