在(非常感谢)
perlmonks网站上,我发现了
following snippet that trims字符串两边的空格:
sub trim {
@_ = $_ if not @_ and defined wantarray;
@_ = @_ if defined wantarray;
for (@_ ? @_ : $_) { s/^\s+//,s/\s+$// }
return wantarray ? @_ : $_[0] if defined wantarray;
}
我不明白为什么作者几乎每一行都要检查各种各样的问题.为什么不修剪字符串,让程序员在传递数组时使用map?
这个修剪之间的区别是什么,如下所示:
my @test_array = ( 'string1',' string2','string3 ',' string4 '); my @result = trim(@test_array);
或者一个简单的修剪,当需要修剪数组时称为这样:
my @test_array = ( 'string1',' string4 ');
my @result = map { trim($_) } @test_array;
解决方法
首先,如果你抽象出那张地图会更好:
#e.1.
sub trim
{
my @ar = @_;
for (@ar) { s/^\s+//,s/\s+$// };
return wantarray ? @ar : $ar[0];
}
其次,考虑以上示例并将其与以下内容进行比较:
#e.2.
sub trim
{
for (@_) { s/^\s+//,s/\s+$// };
}
有什么不同?
E.1.返回一个新的修剪数组,而e.2.修改原始数组.
好了,原来神秘的子程序做了什么?
它自动神奇(是啊,它的Perl)修改原始数组,如果你没有将返回值赋值给任何东西或保持原始数组不变,并返回一个新的修剪数组,如果你将返回值赋给另一个变量.
怎么样?
通过检查是否定义了wantarray.只要函数在右侧并且返回值被赋值给变量“defined wantarray”为真(无论标量/数组上下文如何).