在(非常赞赏的)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/