- ベストアンサー
配列表示画面方法について
- perlでHTMLにテーブルを書き出すプログラムを作成しております。画面仕様の変更により、読み込んだデータを横3列に表示するようテーブルの吐き出しを変更したいです。
- 単純にファイルを3つに分けおのおのフォームで読み込むのではお粗末だと思い、表示部分のプログラムだけで解決したいです。
- 解決策を教えていただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
表示順序に制約が無いのであれば、 <tr><td>行1<td>行2<td>行3</tr> <tr><td>行4(snip.) ――で済むのでは。 表示順序を保ったまま3段分割するなら、 案1)いったん配列@dにデータを読み込んで、 push @a, map { '<><>'; }(1 .. (2-$#a) % 3); # 3段ぴったりになるよう詰め物。 my $step = ($#a + 1) / 3; #1段分のデータ数を計算。 ――として、 <tr><td>行1<td>行$step+1<td>行$step*2+1</tr> <tr><td>行2<td>行$step+2<td>行$step*2+2</tr> ――と出力。 案2)テーブルをネストする。 <table> <table> <tr><td>行1<td>行2<td>行3</tr> </table><table> <tr><td>行$step+1<td>行$step+2<td>行$step+3</tr> (snip)
その他の回答 (2)
- osamuy
- ベストアンサー率42% (1231/2878)
データを3分割して出力するために、1次元配列のデータを2次元配列にみたてて、n行めを出力するためのデータを $a[0][n], $a[1][n], $a[2][n] ――として扱ってみるというのが案1です。 扱いたいデータは2次元ですが、実際に持ってるのは1次元のデータなので、2次元から1次元に逆変換する必要があります。 これは簡単で、1次元配列の要素数をNとし、それを3分割した場合の1段のサイズをMとすると、M * 3 = Nが成り立ち、2次元配列a[x][y]との間には1次元配列d[k]の間には、 x * M + y = k ――が成り立ちます。 これで1次元配列があったとき、そのデータを2次元配列のように扱う方法が理解できたかと思います。 実際には3で割り切れない場合があるので、要素を1個か2個追加して割り切れるようにしてみます。そうしておくと後のプログラミングが楽なので。それがpushとmapのところ。瑣末な話なので混乱させたのなら、申し訳ないです。
お礼
osamuyw様回答が遅れて申し訳ありません。大変参考になりました。ありがとうございます。
- rafysta
- ベストアンサー率45% (24/53)
my $file = 'sample.dat'; open IN, '<', $file or die "cannot open $file: $!"; while(<IN>){ chomp; my @data = split /<>/; print "<tr>\n"; foreach(@data){ print "<td>$_</td>"; } print "</tr>\n"; } close IN;
補足
ご回答ありがとうございます。 理解力不足で申し訳ありませんが案1をもう少し詳しく解説していただけますでしょうか? push @a, map { '<><>'; }(1 .. (2-$#a) % 3); や$step = ($#a + 1) や<tr><td>行1<td>行$step+1<td>行$step*2+1</tr>が分かりません。 大変恐縮ですが、よろしくお願いいたします。 今日中に製作しないといけないのですが、解決しておりません。