Perl语句是否用逗号分隔?

6vl6ewon  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(158)

在这个修改后的快速排序算法中,我将作为个人项目的一部分,用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语句”之类的东西也没有发现什么有用的东西。我试着用分号分隔它们,但是当我尝试这样做的时候,输出是不正确的。这叫什么?它在做什么?

uttx8gqw

uttx8gqw1#

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

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

这个列表就是子例程的结果。如果使用分号,则子例程的结果将是:

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

这是不正确。

shstlldc

shstlldc2#

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

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;

相关问题