我试图弄清楚这个 Perl 脚本中发生了什么。评论是我在想,谢谢你,如果你花时间帮助我。我对 Perl 的经验很少,但对 shell 脚本有一些了解。
我认为@_
是在子例程和$_
全局变量中传递的参数列表,我很难在这个脚本中理解它们的实际用途。
#!/bin/perl
sub quick_sort {
# exit condition, when subset contains less than 2 elements
return @_ if @_ < 2;
# choosing pivot element, using subset as input, rand as random offset, no idea what the 1 is for, man says "int fd_out"
my $p = splice @_, int rand @_, 1;
# actual recursion and the main source of my confusion
# calling quicksort(smaller pivot, pivot, quicksort(greater pivot))
quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
}
# running the damn thing, no greater secrets here, i guess
my @a = (4, 65, 2, -31, 0, 99, 83, 782, 1);
@a = quick_sort @a;
print "@a\n";
quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
让我们分解一下:
@_
是函数参数数组。
$_
是在某些上下文中用作占位符的临时标量变量。
grep $_ < $p, @_
这是一个表达式,它使用grep
内置函数创建一个列表,该列表由@_
满足条件的所有元素组成$_ < $p
——也就是说,在数值上小于主元的所有元素。
结果列表传递给quick_sort
,因此结果是所有小于枢轴的元素的排序列表。
同样的事情发生在另一边:
quick_sort(grep $_ >= $p, @_);
这需要所有@_
大于枢轴的元素并对它们进行排序。
最后:
quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
逗号表达式创建一个包含以下内容的列表:
小于枢轴元素的所有参数的排序列表。
枢轴元素。
大于枢轴元素的所有参数的排序列表。
当你把所有这些放在一起时,你最终会得到一个函数所有参数的排序列表。
但这都是愚蠢的。Perl 有一个内置sort
函数;你可以更简洁地表达同样的事情@a = sort { $a <=> $b } @a
,而且它实际上会更快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句