perl - 在Perl中,函数应该跳个想数组吗?还是可以期望调用者使用map?

标签 perl 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', ' string2', 'string3 ', ' string4 ');
my @result = map { trim($_) } @test_array;

最佳答案

首先,最好将 map 抽象化:

#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)修改原始数组,或者如果您将返回值分配给另一个变量,则保持原始数组不变并返回新的修剪后的数组。 。

如何?

通过检查是否完全定义了想数组。只要函数在右侧,并且将返回值分配给变量“defined wantarray”,则它为true(与标量/数组上下文无关)。

关于perl - 在Perl中,函数应该跳个想数组吗?还是可以期望调用者使用map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8877537/

相关文章:

perl - perl 中的信号处理

C++ 抽象类作为 std::map 键

java - 初始化 ArrayList 的静态映射

在 grails 中作为 map 值列出

java - 映射到 Java 中的字符串

perl - 将 IPC::Open3 与 perlcritic 一起使用

perl 中的 HTML 解析

linux - 如何在 Linux 的 Perl 中使用带有 fcgi 的 unix 域套接字的抽象名称?

linux - 系统:Info perl module to get memory and space information

python - 使用 Python 减少对列表