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

宁达

我试图弄清楚这个 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";
duskwuff -不活跃-
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,而且它实际上会更快。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章