- 締切済み
Perlについて
今Perlのプログラムを組まされているのですが、 IPアドレスなどの数字のような文字列を 数字が小さい順に並べようとしても うまく並べられません。 どうしたらうまく並べれるのですか? たとえば 134.342.444.321 134.342.444.332 134.421.453.222 を 134.421.453.222 134.342.444.321 134.342.444.332 に並べ替えたいのです。 ちなみにデータは大量にあります。 どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- osamuy
- ベストアンサー率42% (1231/2878)
No.2でちょっと修正: 誤: split( /./, $_ ) 正: split( / ¥./, $_ ) 「¥」は、実際には半角のバックスラッシュです。
- osamuy
- ベストアンサー率42% (1231/2878)
要は大小関係さえハッキリさせる事ができれば、整列可能なので、 IPアドレス(IPv4)が32ビットなのを利用して、こんな感じでしょうか? while ( <DATA> ){ chomp; push @addrs, [ $_, unpack( 'N', pack( 'C4', split( /./, $_ ) ) ) ]; } for ( map { $_->[0] } sort { $a->[1] <=> $b->[1] } @addrs ){ print $_, "n"; } __END__ 192.168.10.1 255.255.255.255 10.1.15.0 このソートのやりかたについては、perlfaq4が参考になるかと。 ところで、ソート後の > 134.421.453.222 > 134.342.444.321 > 134.342.444.332 は、規則性がちょっと不明。小さい順といっているのに、1行めが一番大きいし、3行めが一番小さいわけでもなし
- onosuke
- ベストアンサー率67% (310/456)
sort というリスト整列関数 http://www.perldoc.com/perl5.8.0/pod/func/sort.html eq, ne, cmp という3つの文字列比較演算子 http://www.perldoc.com/perl5.8.0/pod/perlop.html#Equality-Operators これらを使えばできます。 後、あなたが質問に書いたとおりの整列順が必要だとすると、大きい順に並べる逆順ソートになりますね。