如何才能使这个基本的Perl子程序分类才能正常工作?

Rob*_*b L 0 sorting perl

我是Perl的新手.有人可以帮助我,并给我一个提示或解决方案,如何让这个排序子程序工作.我知道它与数组如何传递给子程序有关.我在网上搜索并没有找到我满意的答案...我也喜欢SO用户给我的建议.我想让程序在主子程序中打印排序数组.目前,它以原始顺序打印数组@a的元素.我希望子程序修改数组,所以当我打印数组时,它是按排序顺序.任何建议表示赞赏.当然,我想看到解决这个问题的最简单方法.

sub sort {

    my @array = @_;

    my $i;
    my $j;
    my $iMin;

    for ( $i = 0; $i < @_ - 1; $i++ ) {

        $iMin = $i;

        for ( $j = $i + 1; $j < @_; $j++ ) {

            if ( $array[$j] < $array[$iMin] ) {

                $iMin = $j;
            }
        }

        if ( $iMin != $i ) {

            my $temp = $array[$i];
            $array[$i] = $array[$iMin];
            $array[$iMin] = $temp;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从主子程序调用:

sub main {

    my @a = (-23,3,234,-45,0,32,12,54,-10000,1);

    &sort(@a);
    my $i;

    for ( $i = 0; $i < @a; $i++ ) {

        print "$a[$i]\n";

    }
}

main;
Run Code Online (Sandbox Code Playgroud)

Mil*_*ler 5

当您的子进行以下分配时my @array = @_,它将创建传递内容的副本.因此,对值的任何修改@array都不会影响@a子例程.

在澄清这只是个人学习练习之后,有两种解决方案.

1)您可以return对已排序的数组进行分配并将其分配给原始变量

sub mysort {
    my @array = @_;
    ...
    return @array;
}

@a = mysort(@a)
Run Code Online (Sandbox Code Playgroud)

2)或者您可以传递对数组的引用,并处理引用:

sub mysort {
    my $arrayref = shift;
    ...
}

mysort(\@a)
Run Code Online (Sandbox Code Playgroud)

此外,不使用命名的子可能是个好主意,sort因为那是一个内置函数.使用perl的排序复制代码:

@a = sort {$a <=> $b} @a;
Run Code Online (Sandbox Code Playgroud)

此外,应该重写sub中的for循环以使用a的最后一个索引@array,该索引写为$#array,并且range operator ..对于增量器有用:

for ( my $j = $i + 1; $j <= $#array; $j++ ) {

# Or simpler:

for my $j ($i+1 .. $#array) {
Run Code Online (Sandbox Code Playgroud)

最后,因为你是新的,我应该通过对所有的脚本应该开始use strict;use warnings;.原因如下:Why use strict and warnings?