2013-03-11 69 views
1

我必須點亮內部軟件產品中的一些核心組件。由於其STDIN的真的討厭處理我必須:如何讀取STDIN並將內容寫回到Perl中的STDIN?

  1. 閱讀STDIN和備份的原始
  2. 解析它
  3. 寫RAW回STDIN
  4. 讓下游系統處理STDIN

不幸的是我不允許修改任何遺留的代碼,所以我必須點亮它。

我的第一個工作不嘗試:

BEGIN { 
    my $stdin_raw = join '', <STDIN>; 
    use IO::Handle; 
    my $stdin_io1 = IO::Handle->new(); 
    $stdin_io1->printflush($stdin_raw); 
    my $stdin_io2 = IO::Handle->new(); 
    $stdin_io2->printflush($stdin_raw); 
    STDIN->fdopen($stdin_io1, 'r'); 
    require CGI; 
    warn CGI::param('PARAM1'); 
    warn CGI::param('PARAM2'); 
    STDIN->fdopen($stdin_io2, 'r'); 
} 

它能夠在第一線,但通宵CGI也不下游系統都可以從STDIN我(試圖)任何輸入設置上面列出來讀取STDIN。

因此:如何讀取STDIN並將內容寫回到Perl中的STDIN?

該應用程序在CGI(網絡服務器)條件下運行。 STDIN處理Web請求的POST數據。

+0

我不確定你的問題描述是否合理。什麼是STDIN?如果你真的可以寫信給它,它會上游,而不是下游。 – melpomene 2013-03-11 14:09:04

+0

我已添加更多解釋。 – burnersk 2013-03-11 14:13:00

+0

寫入STDIN會將數據發送回Web服務器。它不會讓你再讀STDIN。 – melpomene 2013-03-11 14:18:03

回答

0

閱讀,補充,閱讀STDIN是不可能的。

1

如何open(STDIN, '<', \$stdin_raw)


順便說一句,

my $stdin_raw = join '', <STDIN>; 

通常被寫成

my $stdin_raw; { local $/; $stdin_raw = <STDIN>; } 

也許更有效了。

+0

'my $ stdin_raw = do {local $ /; };' – 2013-03-11 19:33:46

+0

@Brad Gilbert,它更乾淨,但它使整個文件的額外副本 – ikegami 2013-03-11 19:38:06

+0

'打開'調用不工作:( – burnersk 2013-03-12 08:40:17