質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

2461閲覧

(Perl) 「パイプ出力用にオープンする」という操作に関して

zitsp

総合スコア10

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2015/10/23 21:23

Perlで書かれたコードを別言語で書き直すことになったのですが、Perlには不慣れで、次のファイル操作に関する部分の挙動がわからなくて困っており、ご助力お願いします。


コマンドへパイプ出力用にオープンするという操作なのですが、

Perl

1$code = "git show"; 2$cmd .= "hogeA |"; 3$cmd = "hogehogeB -option"; 4 5open(WRITE,"|".$cmd); 6print WRITE $$code; 7close(WRITE);

といったイメージのスクリプトです。
これがshellで、$code | $cmd を実行することだとはわかるのですが、
上記のように$cmd側にもパイプが含まれていた場合は、単純に$code | hogeA | hogehogeBに相当すると思っていいのでしょうか?$code | hogehogeB | hogeA でしょうか?
それとも、$cmd内が先に処理されたところに$codeが出力されるようなことになる(というのは変だと思いますが...)のでしょうか?
この検証に有用なコマンドの組み合わせも教えていただきたいです

また、printの行で「$$code」と、プロセスIDの特殊変数が使われている?ようなのですが、どういう意味(このようなタイミングで使うこと)があるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$cmd .= "hogeA |";
$cmd = "hogehogeB -option";

の部分が間違っていると思います。最初の代入が2つ目の代入で上書きされる。

$$code というのは、$codeの値を変数名と見なしてその変数の値のことです。

Perl

1$foo = 123; 2$bar = "foo"; 3print $$bar; #=> 123 が出力される

質問文の場合、git showという名前の変数は無いと思うので、これも間違いだと思います。

パイプへの出力は、

Perl

1open WRITE, " | cat -n | wc" 2print WRITE, "aaaaaaaaaaaaa"; 3close WRITE;

の場合、シェルで書くと、

Bash

1echo aaaaaaaaaaaaa | sh -c "cat -n | wc"

のように、openで指定したコマンドが、パイプ後段でsh -c "~~~~"として実行されます。

投稿2015/10/23 23:10

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zitsp

2015/10/24 04:40 編集

回答ありがとうございます 1. $cmd .=~ おっしゃる通りでした。初めは上書きになるんじゃとは思って、printで出力を取って試していたのですがそこでミスがあり誤解していたようです。(なぜか元のコードはこうなっていたのですが、回答文のご指摘のようにしたかったのかもしれません...) 2. $$code イメージとしては$($code)で、「$codeの指す文字列」という変数名、ということだったんですね。確かに、そう考えると質問時の書き方はおかしかったようです。元のコードではサブルーチン化されており、 $code = $text->{"hoge"}->{code}; learn(\$code,0); のようになっていたので質問文のようにしてもいけるかと思ったのですが...もう一度見直してみます 3. パイプへの出力も納得できました ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問