如何创建默认使用$ _的Perl函数?

时间:2009-12-01 23:43:21

标签: perl

所以我有一个数组和一个修剪空格的简单函数:

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

现在,我想将它应用于具有map函数的数组。为什么我不能通过给出函数名称来实现这一点,就像使用内置函数一样?

E.g。你可以做到

print map(length,@ar)

但你做不到

print map(trim,@ar)

你必须做类似的事情:

print map {trim($_)} @ar
print map(trim($_),@ar)

4 个答案:

答案 0 :(得分:12)

如果您使用的是5.10或更高版本,则可以将_指定为trim的{​​{3}}。如果您使用的是早期版本,请使用prototype

  

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

use strict; use warnings;

my @x = ("bla ", "ha  1");

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

print map trim, @x;

顺便说一句,不要在$a比较器之外使用$bsort:它们不受strict检查。

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

map trim($_), @x;

另见Axeman's answer

  

当然,这一切都非常强大,只应在适度的情况下使用才能让世界变得更美好。

答案 1 :(得分:7)

Sinan谈论的原型是目前最好的方式。但是对于早期版本,仍然有旧备用版本:

sub trim { 
    # v-- Here's the quick way to do it.
    my $str = @_ ? $_[0] : $_;
    # That was it.

    $str =~ s/^\s+|\s+$//;
    return $str;
 }

当然,我有一个具有更多功能的trim函数,并处理更多的参数和列表上下文,但它也没有演示这个概念。三元表达式是快速实现'_'原型角色现在所做的事情。

...... BTW,Perl规则!

答案 2 :(得分:3)

我最喜欢使用$ _而不需要5.10+的方法如下:

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

如果有的话,将@_的第一个元素分配给$ s,否则使用$ _

答案 3 :(得分:-8)

如果没有参数,许多Perl内置函数都在$ _上运行。

如果你的功能相同,它会起作用:

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

是的,Perl有点粗糙。