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

Perl 5 - How does this script work and what is @_ and $_?

我想弄清楚这个 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, @_);

逗号表达式创建一个包含以下内容的列表:

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

  2. 枢轴元素。

  3. 所有大于主元的参数的排序列表。

当你将所有这些放在一起时,你最终会得到一个函数所有参数的排序列表。

但这都是愚蠢的。 Perl 有一个内置的 sort 函数;你可以像 @a = sort { $a <=> $b } @a 一样更简洁地表达同样的事情,而且实际上会快得多。