在(非常感谢)
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”为真(无论标量/数组上下文如何).