在Perl中,一个函数应该执行wantarray舞蹈,还是我们可以期望调用者使用map?

前端之家收集整理的这篇文章主要介绍了在Perl中,一个函数应该执行wantarray舞蹈,还是我们可以期望调用者使用map?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在(非常感谢) 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”为真(无论标量/数组上下文如何).

原文链接:https://www.f2er.com/Perl/172422.html

猜你在找的Perl相关文章