2013-05-02 86 views
1

是否有一個Perl的功能,無論是內置的,或者是像下面這樣的庫:Perl中打開自定義文件句柄外部命令

run(IN_FILEHANDLE, OUT_FILEHANDLE, ERR_FILEHANDLE, $cmd); 

它獲取外部命令從IN_FILEHANDLE讀,寫OUT_FILEHANLE與stderr去ERR_FILEHANDLE。

例如

run(STDIN, STDOUT, STDERR, $cmd); 

將類似於:

system($cmd); 

和:

run(IN, OUT, ERR, $cmd); 

會有點像一個不存在的版本:

open(IN, OUT, ERR, "|$cmd|"); 

我發現open($fh, "|$cmd"); ,和open($fh, "$cmd|");易於使用,我只是從文件句柄讀取/寫入。我只想要一種能夠同時工作的方法。

如果還可以選擇讀取/寫入標量,則可以獲得獎勵積分。

我一直在open3IPC::Run四處尋找,但我似乎無法讓他們工作。工作示例(可能與例如grep),將不勝感激。

編輯:在迴應評論,我當前的代碼:

open3($stdin_fh, $stdout_fh, $stderr_fh, $refresh_exec); #1 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

似乎達成線#2

,並使用IPC::Run前懸掛:

start \@cmd_arr, $stdin_fh, $stdout_fh, $stderr_fh; 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

運行命令但寫道給出了錯誤:Can't use an undefined value as a symbol reference

我知道我的代碼不完整,但我不想粘貼400行代碼,如果我可以成功地將其剪下並隔離問題,我不需要問這個問題。

我甚至不確定是否open3IPC::Run做我想做的,所以我只是尋找一個我可以建立的工作解決方案。

+2

你爲什麼不用'run3'顯示你正在使用的代碼,並解釋到底哪些工作不工作? – Mat 2013-05-02 07:19:38

+0

更多詳細信息已添加。 – Clinton 2013-05-02 07:32:48

+0

你在'輸入到命令'的末尾放了'\ n'嗎? – Barmar 2013-05-02 07:45:38

回答

0

我想:

  1. 重定向STD *所需FH的。
  2. 執行system($cmd);
  3. 將STD *恢復到原始狀態。

看一看哈日的例如,對於詳細的方法:

https://stackoverflow.com/a/1720592/1485996

您也可以使用local避免恢復STD。

+0

你能舉一個例子,說明如何讓我直接將'print'打印到像'open($ fh,「| $ cmd」)''那樣的'cmd'輸入中? – Clinton 2013-05-02 14:41:27