• 締切済み

2次元配列or複数回のファイル読み込み方法

入力ファイルに A1, A2, A3, A4... B1, B2, B3, B4... というように記述されており、 そのファイルを処理した結果 A1 B1 A2 B2 A3 B3 のようになるように処理したいです。 どのようにすれば実現できるでしょうか? 二次元配列が使用できれば、 入力ファイル情報を配列に保持できると思いますし、 入力ファイルを複数回読めれば、 そのたびに、読む列を変更できるのですが。。 Perl初心者ですが、よろしくお願いします

みんなの回答

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

Perlはリストの処理の関数が デフォルトだと少ないんですよねえ ということで,こんな関数をでっちあげました. zip 引数 二つの配列のリファレンス 返値 一つの配列のリファレンス 動作例 zip ([1,2,3], [a,b,c]) -> [[1,a],[2,b],[3,c]] zip ([1,2,3,4], [a,b,c]) -> [[1,a],[2,b],[3,c]] zip ([1,2,3], [a,b,c,d]) -> [[1,a],[2,b],[3,c]] 引数の配列リファレンスのうち,短いほうに合わせて 中身を``zip''します(ジッパーで閉めます). #ぶっちゃけた話Haskell/Schemeあたりにある #zipの劣化コピー(^^; ##配列が空であるかどうかの判定が気に入らない use strict; use warnings; sub zip{ my $a = shift; my $b = shift; my @temparray; unless ((scalar @{$a}) * (scalar @{$b}) == 0){ push @temparray, [shift @{$a}, shift @{$b}]; push @temparray, @{zip($a, $b)}; return \@temparray; }else{ return []; } } my @list; foreach (<DATA>){ chomp; push @list, [split /,\s*/]; } foreach (@{zip($list[0],$list[1])}){ print $_->[0],"\n"; print $_->[1],"\n"; } __DATA__ A1, A2, A3, A4 B1, B2, B3, B4

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

同じファイルを複数回読むのは、close してから再度 open すればできませんか? 一つ目の質問も二次元配列、というか配列の配列が使えます。 詳しくはこの辺をどうぞ perllol - Perl で配列の配列を操作する http://perldoc.jp/docs/perl/5.6.1/perllol.pod 処理した結果というのは、全部をひとつのファイルに吐き出すのですか? それとも列ごとに別のファイルですか? use strict; use warnings; use feature ':5.10'; my @data; foreach my $line (<DATA>) { chomp $line; push @data, [split q{,}, $line]; } foreach my $i (0 .. scalar @{$data[0]} - 1) { foreach my $j (0 .. scalar @data - 1) { say $data[$j][$i] } } __END__ A1, A2, A3, A4 B1, B2, B3, B4 実行結果: A1 B1 A2 B2 A3 B3 A4 B4 余計な空白等はまあ適当に。

関連するQ&A