Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Perl中排序数组失败_Arrays_Perl_Sorting - Fatal编程技术网

Arrays 在Perl中排序数组失败

Arrays 在Perl中排序数组失败,arrays,perl,sorting,Arrays,Perl,Sorting,我练习将成员插入数组并对其排序,然后打印出成员列表 use strict; use warnings; use Data::Dumper; my $fh = \*DATA; while(my $line = <$fh>) { chomp($line); $line =~ s/\s+//g; push(my @ArrLines, $line); my @SortedArr = sort @ArrLines;

我练习将成员插入数组并对其排序,然后打印出成员列表

use strict;
use warnings;
use Data::Dumper;

my $fh = \*DATA;


while(my $line = <$fh>) {



        chomp($line);
        $line =~ s/\s+//g;

        push(my @ArrLines, $line);

        my @SortedArr = sort @ArrLines;

        foreach my $val (@SortedArr) {

                print "$val\n";
        }
}

__DATA__
A2B12,A8B15
A3B27
A5B14,A8B15,A5B18
注意:只保留一个重复项,如
A8B15


谢谢你的意见和建议。

< P>阅读后排序,不要在中间排序。< /P>
push(my@ArrLines
每次都创建一个新的@ArrLines。在循环外声明它

你不会在任何地方用逗号分开,但似乎需要这样做

消除重复数据的最简单方法是使用哈希而不是数组

因此:

使用严格;
使用警告;
使用数据::转储程序;
my$fh=\*数据;
我的%行;
while(我的$line=){
chomp($line);
$lines{$\}++用于拆分/,/,$line;
}
my@sorted_array=排序键%行;
打印转储程序\@排序数组;

> p>读后排序,不要在中间排序。

push(my@ArrLines
每次都创建一个新的@ArrLines。在循环外声明它

你不会在任何地方用逗号分开,但似乎需要这样做

消除重复数据的最简单方法是使用哈希而不是数组

因此:

使用严格;
使用警告;
使用数据::转储程序;
my$fh=\*数据;
我的%行;
while(我的$line=){
chomp($line);
$lines{$\}++用于拆分/,/,$line;
}
my@sorted_array=排序键%行;
打印转储程序\@排序数组;

有几个问题:

  • 您需要在读取行的循环上方声明
    my@ArrLines;
    。当前,在读取每一行之后,它将被重新声明(因此设置为空)

  • 您需要在读取行的循环之后执行排序和输出

  • 此外,您没有使用逗号分割输入,从“预期输出”判断,您应该这样做。您可以使用
    split()
    函数进行此操作


    此外,您提到您希望重复的项目只出现一次,但您没有采取任何措施来实现这一点。一旦对项目进行了排序,就可以检查当前项目是否与前一个项目相同,如果不相同,就只打印它。

    有几个问题:

  • 您需要在读取行的循环上方声明
    my@ArrLines;
    。当前,在读取每一行之后,它将被重新声明(因此设置为空)

  • 您需要在读取行的循环之后执行排序和输出

  • 此外,您没有使用逗号分割输入,从“预期输出”判断,您应该这样做。您可以使用
    split()
    函数进行此操作


    此外,您提到您希望重复的项目只出现一次,但您没有采取任何措施来实现这一点。一旦对项目进行排序,就可以检查当前项目是否与前一个项目相同,如果不相同,则只打印它。

    啊,我查看了我的参考书。发现哈希值可以是1。键和值;2.a一桶数据。我认为我的案例适合一桶数据。一开始,我不想使用哈希,因为我只记得哈希是一种包含键和值的数据结构。谢谢。啊,我查阅了我的参考书。发现哈希可以是1。键和值;2。一桶数据。我认为我的案例适合一桶数据ta.一开始,我不想使用哈希,因为我只记得哈希是一种包含键和值的数据结构。谢谢。
    A2B12
    A3B27
    A5B14    
    A5B18
    A8B15
    
    use strict;
    use warnings;
    use Data::Dumper;
    
    my $fh = \*DATA;
    
    my %lines;
    while (my $line = <$fh>) {
        chomp($line);
        $lines{$_}++ for split /,/, $line;
    }
    
    my @sorted_array = sort keys %lines;
    print Dumper \@sorted_array;