用逗号分隔的Perl语句?

时间:2014-08-17 08:15:20

标签: perl quicksort comma

在这个修改过的快速排序算法中,我正在解析/重写个人项目的一部分,在Perl中:

sub quick_sort {
    my @a = @_;
    return @a if @a < 2;
    my $p = splice @a, int( $#a / 2 ), 1;
    (
        quick_sort( grep $_ < $p, @a ),
        $p,
        quick_sort( grep $_ >= $p, @a ),
    );
}

print "Enter a list of numbers, separated by commas (e.g. 2,5,1,7): ";
my @a = split ",", <STDIN>;
@a = quick_sort(@a);
chomp(@a);
print "@a\n";

我很困惑这个陈述,或者更确切地说,用逗号分隔的一组陈述(我猜?):

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

我甚至不知道那叫什么,所以谷歌搜索“用逗号分隔的perl语句”之类的东西没有用。我已经通过用分号分隔它们进行了实验,但是当我尝试时输出是不正确的。这叫什么,它在做什么?

2 个答案:

答案 0 :(得分:2)

这三个最后一行形成一个语句,其结果是一个列表:

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

该列表是子程序的结果。如果使用semmicolon,则子例程的结果为:

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

这是不正确的。

答案 1 :(得分:0)

这是对子程序的递归调用。这就是它真正的作用:

sub quick_sort {

## Grabs the list passed from the main body in to an array a
my @a = @_;

## If the scalar value of array is less than 2 
## then no sorting is needed so return the array as is
return @a if @a < 2;

## If not then grab one element which is from the middle of the array
my $p = splice (@a, int($#a / 2), 1);

## Call your method in recursion with list of 3 elements, first being an element smaller
## than the sliced, the element obtained from slice and an element
## greater than or equal to the sliced one
quick_sort(grep $_ < $p, @a), $p, quick_sort(grep $_ >= $p, @a);

}

由于slice是破坏性函数,因此在每次迭代时,您的数组将缩小到满足以下条件并退出的程度。

return @a if @a < 2;