- ベストアンサー
配列の表示順をコントロールする方法とは?
- 配列の数が同じ場合、表示順序を意図した順番にすることは可能かを教えてください。
- 配列の数の多い順に配列を表示し、その中で値の並びを別の配列を参考にして順番を決めたいです。
- 配列の数が同じ場合でも、意図した順番になる方法として、Tie::IxHashモジュールを使用する方法があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
わけの分からない連番のついた変数を使ってるとか、シンボリックリファレンスを使っているとか 突っ込みたいところはあるんですがそれはおいといて、 配列の要素数が同じな場合は先頭の文字コードの大小で決めると言うパターンを例にすると こんな感じになります。 あと >ハッシュの配列 配列のハッシュ、ですよね。 #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; no strict 'refs'; my @array0_n = qw(a b c d); my @array1_n = qw(e f g); my @array2_n = qw(h i); my @array3_n = qw(j); my @array4_n = (); my @array5_n = (); my @array6_n = qw(k); my @array7_n = qw(l n); my @array8_n = qw(m o p); my @array9_n = qw(q r s t); my %array1 = ( 0 => [ @array0_n ], 1 => [ @array1_n ], 2 => [ @array2_n ], 3 => [ @array3_n ], 4 => [ @array4_n ], 5 => [ @array5_n ], 6 => [ @array6_n ], 7 => [ @array7_n ], 8 => [ @array8_n ], 9 => [ @array9_n ], ); #配列の要素数の多い順にソート。要素数が等しいときは先頭の文字で決定 my @array2 = sort { scalar @{$array1{$b}} <=> scalar @{$array1{$a}} or $array1{$b}[0] cmp $array1{$a}[0] } keys %array1; our @array9_n2 = qw(a2 b2 c2 d2); our @array1_n2 = qw(e2 f2 g2); our @array2_n2 = qw(h2 i2); our @array3_n2 = qw(j2); our @array4_n2 = (); our @array5_n2 = (); our @array6_n2 = qw(k2); our @array7_n2 = qw(l2 n2); our @array8_n2 = qw(m2 o2 p2); our @array0_n2 = qw(q2 r2 s2 t2); foreach (@array2){ my $x = "array${_}_n2"; say "$_, $#{$x}, @$x<br>"; } say '######'; my @ary_of_ary = ( \@array0_n2, \@array1_n2, \@array2_n2, \@array3_n2, \@array4_n2, \@array5_n2, \@array6_n2, \@array7_n2, \@array8_n2, \@array9_n2, ); foreach (@array2){ say "$_, $#{$ary_of_ary[$_]}, @{$ary_of_ary[$_]}<br>"; } perl okw.pl Use of uninitialized value in string comparison (cmp) at okw.pl line 34. Use of uninitialized value in string comparison (cmp) at okw.pl line 34. 9, 3, a2 b2 c2 d2<br> 0, 3, q2 r2 s2 t2<br> 8, 2, m2 o2 p2<br> 1, 2, e2 f2 g2<br> 7, 1, l2 n2<br> 2, 1, h2 i2<br> 6, 0, k2<br> 3, 0, j2<br> 4, -1, <br> 5, -1, <br> ###### 9, 3, a2 b2 c2 d2<br> 0, 3, q2 r2 s2 t2<br> 8, 2, m2 o2 p2<br> 1, 2, e2 f2 g2<br> 7, 1, l2 n2<br> 2, 1, h2 i2<br> 6, 0, k2<br> 3, 0, j2<br> 4, -1, <br> 5, -1, <br> 面倒なので34行目で出ている警告は消してません。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
「2つのデータが期待した順序になっている」という条件をプログラムで書ければ全く問題なく可能です. sort が終わると, 隣り合うデータが「比較関数を満たす」ように並びますから.