加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读