2010-12-29 12 views
0

私は配列にメンバーを挿入してソートし、メンバーリストをプリントアウトしました。Perlでアレイを並べ替えることができませんでした

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 

次のように出力が欲しいですが、動作しないことがわかりました。

A2B12 
A3B27 
A5B14  
A5B18 
A8B15 

注:A8B15のように重複した項目の1つだけ残っています。

あなたのコメントや提案に感謝します。

答えて

2

読んだ後に並べ替え、途中でソートしないでください。

push(my @ArrLinesは、毎回新しい@ArrLinesを作成します。ループの外側に宣言します。

カンマで区切ってはいませんが、必要があるようです。

重複排除する最も簡単な方法は、配列の代わりにハッシュを使用することです。

ので:

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; 
+0

ああ、私は参考書をハッシュアップしました。ハッシュは1とすることができます。データのバレル。私はデータのバレル*のために私のケーススーツを考えた。最初は、ハッシュがキーと値の両方を含むデータ構造であることを覚えているだけのためにハッシュを使用したくないです。ありがとうございました。 –

1

は問題がいくつかあります:

  1. あなたが上記my @ArrLines;に行を読み込み、ループを宣言する必要があります。現在、各行が読み込まれた後で再宣言されているため(空に設定されています)

  2. の後に、の行を読み込むループをソートして出力する必要があります。

また、入力をカンマで区切っておらず、「期待される出力」から判断してください。これにはsplit()関数を使用できます。

また、重複したアイテムを一度しか表示しないように言いますが、それを達成するために何もしていません。アイテムがソートされたら、現在のアイテムが前のアイテムと同じかどうかをチェックし、そうでない場合はそれを印刷するだけで十分です。

関連する問題