• ベストアンサー

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 のようにしたいのです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.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 が制御変数にあたります。 この制御変数は省略することができ、その場合にはデフォルト変数の $_ が代わりに使われるというわけです。

white-tiger
質問者

補足

ありがとうございます。 foreach を後ろに書くことができるということも衝撃でした。 すぐわかるPerlという本を読んだのですが(すごく良い本でしたが)、まだ知識が足らないですね。

その他の回答 (3)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

バッククォートまたは 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;

white-tiger
質問者

補足

ありがとうございます。すごくエレガントですね! 最後の行だけ理解できないところがあるのですが教えていただけないでしょうか? (1) $out_A[$_]の「$_」の役割はどういったものでしょうか?($_は勉強したばかりで、下の方のような使い方ならわかるのですが、まだ知識不足のようです) (2) foreach 0 .. $#out_A; の .. の意味を教えていただけないでしょうか?(#は配列の要素数ですよね?) よろしくおねがいします。

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

各プログラムが出力するデータ列の行数は、すべて同じですか?(今回の場合、programA, programB, programC の出力はいずれも4行になっていますが、programBだけ5行になったりということはない?)

white-tiger
質問者

補足

はい。出力行数は一緒です。

  • maura
  • ベストアンサー率46% (48/104)
回答No.1

$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);

white-tiger
質問者

補足

ありがとうございます。 while (<AOUT>) のところは1行ずつ読み込むんですね。 なるほど。。

関連するQ&A