代码之家  ›  专栏  ›  技术社区  ›  naumcho

如何使Perl函数在默认情况下使用$\ux?

  •  4
  • naumcho  · 技术社区  · 15 年前

    my @ar=("bla ", "ha  1")
    sub trim { my $a = shift; $a =~ s/\s+$//; $a}
    

    现在,我想将其应用于 地图

    例如,你可以

    print map(length, @ar)
    

    print map(trim, @ar)
    

    您必须执行以下操作:

    print map {trim($_)} @ar
    print map(trim($_), @ar)
    
    4 回复  |  直到 4 年前
        1
  •  12
  •   Community CDub    8 年前

    如果您使用的是5.10或更高版本,则可以指定 _ 作为 prototype trim Axeman's answer :

    作为原型的最后一个字符,或者在分号之前,可以使用 代替 $ :如果未提供此参数, $_ 将改为使用。

    use strict; use warnings;
    
    my @x = ("bla ", "ha  1");
    
    sub trim(_) { my ($x) = @_; $x =~ s!\s+$!!; $x }
    
    print map trim, @x;
    

    $a $b 外面 sort strict 检查。

    然而,我不喜欢在我编写的函数中使用原型,主要是因为它们的使用使得在精神上解析代码变得更加困难。因此,我更喜欢使用:

    map trim($_), @x;
    

    另见 perldoc perlsub :

        2
  •  7
  •   Peter Mortensen icecrime    4 年前

    原型 Sinan talks about

    sub trim {
        # v-- Here's the quick way to do it.
        my $str = @_ ? $_[0] : $_;
        # That was it.
    
        $str =~ s/^\s+|\s+$//;
        return $str;
     }
    

    trim 函数具有更多的特性,处理更多的参数和列表上下文,但它没有演示这个概念。三元表达式是一种快速实现‘‘’原型角色现在的功能的方法。

        3
  •  3
  •   Peter Mortensen icecrime    4 年前

    $_

    sub trim {
        my ($s) = (@_, $_);
        $s =~ s/\s+$//;
        $s
    }
    

    这将指定 @_ $s .

        4
  •  -8
  •   Peter Mortensen icecrime    4 年前

    如果您的函数也这样做,它将工作:

    my @ar = ("bla ", "ha  1");
    sub trim { my $s = @_ ? $_[0] : $_; $s =~ s/\s+$//; $s}
    print map(trim, @ar), "\n";
    

    是的,Perl有点恶心。