Perl 5 - 这个脚本是如何工作的以及@_和$ _是什么?

时间:2018-05-28 21:50:15

标签: perl grep quicksort splice

我试图弄清楚这个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";

1 个答案:

答案 0 :(得分:2)

quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);

让我们打破这个:

@_是函数参数数组。

$_是一个临时标量变量,在某些情况下用作占位符。

grep $_ < $p, @_

这是一个表达式,它使用grep内置函数创建一个列表,该列表包含满足条件@_的{​​{1}}中的所有元素 - 即所有元素在数字上小于枢轴。

结果列表将传递给$_ < $p,因此结果是一个排序列表,其中包含少于数据透视的所有元素。

另一方面也发生了同样的事情:

quick_sort

这会使quick_sort(grep $_ >= $p, @_); 的所有元素都大于数据透视表并对其进行排序。

最后:

@_

逗号表达式创建一个由以下内容组成的列表:

  1. 小于pivot元素的所有参数的排序列表。

  2. 枢轴元素。

  3. 所有参数的排序列表,大于pivot元素。

  4. 当你把它们放在一起时,你最终得到了函数所有参数的排序列表。

    但这完全是愚蠢的。 Perl有一个内置quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_); 函数;你可以像sort更简洁地表达同样的事情,而且实际上要快得多。