所以我有一个数组和一个修剪空格的简单函数:
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)
答案 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
比较器之外使用$b
和sort
:它们不受strict
检查。
但是,我不喜欢将原型用于我编写的函数,主要是因为它们的使用使得在精神上解析代码变得更加困难。所以,我更喜欢使用:
map trim($_), @x;
当然,这一切都非常强大,只应在适度的情况下使用才能让世界变得更美好。
答案 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有点粗糙。