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, @_);
逗号表达式创建一个包含以下内容的列表:
小于主元的所有参数的排序列表。
枢轴元素。
所有大于主元的参数的排序列表。
当你将所有这些放在一起时,你最终会得到一个函数所有参数的排序列表。
但这都是愚蠢的。 Perl 有一个内置的 sort
函数;你可以像 @a = sort { $a <=> $b } @a
一样更简洁地表达同样的事情,而且实际上会快得多。
我想弄清楚这个 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
一样更简洁地表达同样的事情,而且实际上会快得多。