我是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)
当您的子进行以下分配时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?