所以我有一个数组和一个修剪空格的简单函数:
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)
当然,这一切都非常强大,应该只在适度的情况下使用才能让世界变得更美好.
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规则!
归档时间: |
|
查看次数: |
367 次 |
最近记录: |