- ベストアンサー
半角文字の縦書き表示
perlにて配列の要素を下のように縦書き表示をするのに、 1文字ごと配列に保管して、2次元配列で表示する方法を思いついたのですが、 perlの知識が浅いもので、もっとスマートなスクリプトがありましたらぜひとも教えて下さい? @aaa = ( "1234", "ABCDE", "XYZ" ); [出力結果] A 1B 2CX 3DY 4EZ ("A"の左右と、Bの右にはブランクが入っています。)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.2で書いたコードより実行効率の良さそうな方法を思いつきました。 一旦、文字列をreverseさせてから結合しています。 my @aaa = ( "1234", "ABCDE", "XYZ" ); @aaa = map { str => scalar reverse, len => length }, @aaa; my ($i, @result) = 0; while (1) { my $str = join q{}, map { $i < $_->{len} ? substr($_->{str}, $i, 1) : q{ } } @aaa; last if $str eq q{ }x@aaa; push @result, $str; $i++; } print join("\n", reverse @result);
その他の回答 (3)
- _--_1l1_1_
- ベストアンサー率67% (102/152)
あんまり、かわらんか my @aaa = ( "1234", "ABCDE", "XYZ" ); my $max = 0; my @info_table = map { my $len = length $_; $max = $len if $max < $len; { len => $len, chars => [ split '', $_ ] } } @aaa; while ($max) { for my $info (@info_table) { my $len = $info->{len}; print $max <= $len ? $info->{chars}->[ $len - $max] : ' '; } print "\n"; $max--; }
お礼
ありがとうございます。 変数の動きを見ないと理解できないもので、初心者の私にはデバッグしやすいソースと感じました。 とても、勉強になります。
- ryu_chan
- ベストアンサー率37% (69/186)
コード量を減らすためmapを多用してしまいしたが、素直に書いてみました。 mapの多重ループになっているのを何とかしたいところですが、私には限界です。 use List::Util qw(max); my @aaa = ( "1234", "ABCDE", "XYZ" ); my $max_len = max map(length, @aaa); @aaa = map sprintf("%${max_len}s", $_), @aaa; @aaa = map { my $i = $_; join( q{}, map { substr $_, $i, 1 } @aaa ); } 0..$max_len-1; print join("\n", @aaa); 何かエレガントな方法がありそうな感じですよね。
- zxcv0000
- ベストアンサー率56% (111/196)
・ 注目桁番号でループする ・ 文字列から注目桁の 1文字を取り出すのは substr() ・ ループ内で 1行出力 で、配列は使わずに 1重ループで出来ます。 課題の可能性がある質問には、完成コードは書かない事にしています。 悪しからずご了承ください。
お礼
ヒントありがとうございます。 おかげさまで、イメージがつかめましたので、テストしてみたいと思います。 P.S. 最終行を見てハッとしました。 私は、自己啓発でperlを学んでいる社会人でして。 確かに、宿題の答えを求めて投稿する人もいそうですね。
お礼
回答ありがとうございます。 初めて見る関数もありperlの奥深さを知りました。 じっくりと1行1行調べて理解を深めたいと思います。