- ベストアンサー
perl で複数のデータ列を結合して出力する方法
perl で、他のいくつかのプログラムが出力するデータ列を結合して出力する方法はないでしょうか? 例えば、三つのプログラム programA, programB, programC の出力が % programA 1 2 3 4 % programB 1 4 9 16 % programC 1 8 27 64 だとします。 perl スクリプトでこれらのプログラムを呼び出して、 % test.pl programA programB programC 1 1 1 2 4 8 3 9 27 4 16 64 のようにしたいのです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
最後の行をもう少しわかりやすい形にすると、次のようになります。 foreach my $index (0 .. $#out_A) { print "$out_A[$index] $out_B[$index] $out_C[$index]\n"; } .. は、範囲演算子と言います。左側の数字から右側の数字までの1刻みの リストを返します。右側の $#out_A は配列 @out_A の最後の添字ですので、 この場合 0, 1, 2, 3 のリストが得られます。 foreach では、リストの各要素が制御変数にセットされて繰り返し実行され ることになります。上のコードでは、$index が制御変数にあたります。 この制御変数は省略することができ、その場合にはデフォルト変数の $_ が代わりに使われるというわけです。
その他の回答 (3)
- kumoz
- ベストアンサー率64% (120/185)
バッククォートまたは qx を使用すると、プログラムの出力を Perl に取り込むことができます。 use strict; my ($programA, $programB, $programC) = @ARGV; my @out_A = qx{$programA}; chomp @out_A; my @out_B = qx{$programB}; chomp @out_B; my @out_C = qx{$programC}; chomp @out_C; print "$out_A[$_] $out_B[$_] $out_C[$_]\n" foreach 0 .. $#out_A;
補足
ありがとうございます。すごくエレガントですね! 最後の行だけ理解できないところがあるのですが教えていただけないでしょうか? (1) $out_A[$_]の「$_」の役割はどういったものでしょうか?($_は勉強したばかりで、下の方のような使い方ならわかるのですが、まだ知識不足のようです) (2) foreach 0 .. $#out_A; の .. の意味を教えていただけないでしょうか?(#は配列の要素数ですよね?) よろしくおねがいします。
- rafysta
- ベストアンサー率45% (24/53)
各プログラムが出力するデータ列の行数は、すべて同じですか?(今回の場合、programA, programB, programC の出力はいずれも4行になっていますが、programBだけ5行になったりということはない?)
補足
はい。出力行数は一緒です。
- maura
- ベストアンサー率46% (48/104)
$programA = $ARGV[0]; $programB = $ARGV[1]; $programC = $ARGV[2]; open(AOUT, "$programA |"); open(BOUT, "$programB |"); open(COUT, "$programC |"); while (<AOUT>){ my $a = $_; my $b = <BOUT>; my $c = <COUT>; print $a,$b,$c; } close(AOUT); close(BOUT); close(COUT);
補足
ありがとうございます。 while (<AOUT>) のところは1行ずつ読み込むんですね。 なるほど。。
補足
ありがとうございます。 foreach を後ろに書くことができるということも衝撃でした。 すぐわかるPerlという本を読んだのですが(すごく良い本でしたが)、まだ知識が足らないですね。