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

nau*_*cho 4 perl

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

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

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

你可以这样做

print map(length,@ar)
Run Code Online (Sandbox Code Playgroud)

但你做不到

print map(trim,@ar)
Run Code Online (Sandbox Code Playgroud)

你必须做类似的事情:

print map {trim($_)} @ar
print map(trim($_),@ar)
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 12

如果你是使用5.10或更高版本,可以指定_原型trim.如果您使用的是早期版本,请使用Axeman的答案:

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

use strict; use warnings;

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

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

print map trim, @x;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,不要用$a$b一个外部的sort比较:他们是从免疫strict检查.

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

map trim($_), @x;
Run Code Online (Sandbox Code Playgroud)

另见perldoc perlsub:

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


Axe*_*man 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

... BTW,Perl规则!