在Perl中,一个函数应该执行wantarray舞蹈,还是我们可以期望调用
发布时间:2020-12-15 21:32:51 所属栏目:大数据 来源:网络整理
导读:在(非常感谢) perlmonks网站上,我发现了 following snippet that trims字符串两边的空格: sub trim { @_ = $_ if not @_ and defined wantarray; @_ = @_ if defined wantarray; for (@_ ? @_ : $_) { s/^s+//,s/s+$// } return wantarray ? @_ : $_[0] i
在(非常感谢)
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”为真(无论标量/数组上下文如何). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |