我试图弄清楚这个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";
答案 0 :(得分:2)
quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
让我们打破这个:
@_
是函数参数数组。
$_
是一个临时标量变量,在某些情况下用作占位符。
grep $_ < $p, @_
这是一个表达式,它使用grep
内置函数创建一个列表,该列表包含满足条件@_
的{{1}}中的所有元素 - 即所有元素在数字上小于枢轴。
结果列表将传递给$_ < $p
,因此结果是一个排序列表,其中包含少于数据透视的所有元素。
另一方面也发生了同样的事情:
quick_sort
这会使quick_sort(grep $_ >= $p, @_);
的所有元素都大于数据透视表并对其进行排序。
最后:
@_
逗号表达式创建一个由以下内容组成的列表:
小于pivot元素的所有参数的排序列表。
枢轴元素。
所有参数的排序列表,大于pivot元素。
当你把它们放在一起时,你最终得到了函数所有参数的排序列表。
但这完全是愚蠢的。 Perl有一个内置quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
函数;你可以像sort
更简洁地表达同样的事情,而且实际上要快得多。