2010-04-19 72 views
2

我知道我能做到這一點,是否可以打開一個打印到perl變量的基於管道的文件句柄?

 

------ 
open(F,">",\$var); 
print F "something cool"; 
close(F); 
print $var; 
------ 
 

或此,

 

open(F, "| ./prog1 | ./prog2 > tmp.file"); 
print F "something cool"; 
close(F); 
 

但有可能結合這些?我想做什麼的語義應該從以下幾點明確,

 

open(F,"|./prog1 | ./prog2", \$var); 
print F "something cool"; 
close(F); 
print $var; 
 

但是,上述顯然不會工作。

幾分鐘的試驗和谷歌搜索似乎表明,這是不可能的,但我想知道如果我堅持使用``來捕獲輸出。

回答

0

我真正想做的事情在perl中是不可能的。

0

你想要做的就是像打開文件句柄一樣,將內容讀入一個變量,將所需的任何內容追加到變量中,然後將set the environment variable as is stated here附加到剛剛生成的完整字符串中。

你幾乎在那裏,我希望能幫到你。 :)

+0

嗯,我知道我可以啜食文件我想餵養到變量管道,然後一次發送 - 認爲這就是你的建議,對吧?但我想這樣做,我認爲是不可能的行。 – si28719e 2010-04-19 12:03:10

+0

是的,我不知道一行一行地去做。 – 2010-04-19 12:52:30

+0

要逐行執行此操作,請使用'while'循環逐行處理輸入句柄並打印到輸出句柄。 '打印OUT $ _而;' – daotoad 2010-04-19 15:29:47

0

看來,這是不可能的,因爲perl不支持'管道兩端'。這裏更多的信息,

http://perldoc.perl.org/perlipc.html

Corion了在perlmonks.org回答了這個給我。

+0

你發佈到SOPW或在喋喋不休中提問?如果SOPW,請發佈鏈接。 – daotoad 2010-04-19 15:47:18

+0

我經常感到驚訝的是,在Perl中不可能的事情是多少。這是另一個不可能的例子:請參閱daotoad對綁定變量的建議。 – mob 2010-04-20 03:53:45

+0

這是喋喋不休的盒子,對不起 – si28719e 2010-04-22 01:25:19

0
  • IPC::Open2可能會訣竅,請參閱man perlipc。然而,更有可能的是,你會以這種方式僵化你的程序。不過,只要管道中的數據小於PIPE_BUF(在Linux 4096上),只寫入一次,並且在寫入數據之後和讀取結果之前立即關閉寫入端。

  • 您可能會嘗試將程序重寫爲fork,以便最終得到:YourProg | ./prog1 | ./prog2 | YourProgForked

  • 在現代Linux上,您可以使用/ dev/shm將臨時文件完全存放在虛擬內存中。

1

您可以通過幾種方式實現您的目標。它們都不如將額外的東西打入open那麼容易。

您可以使用IO::Tee或其他類似的模塊,甚至寫自己的tee風格子程序:

my $var =''; 

open my $vh, '>', \$var or die "oh noes $!\n"; 
open my $ph, '| ./prog1 | ./prog2' or die "Uh oh $!\n"; 

my @handles = ($vh, $ph); 

print_to_all(\@handles, 
    "I like cheese.\n", 
    "I like teas.\n", 
); 

print $var;  

sub print_to_all { 
    my $handles = shift; 

    for my $h (@$handles) { 
     print $h @_; 
    } 

    return; 
} 

另一種方法去將是使一個tied variable充當文件句柄,並在標同時。

+0

在上面的例子中,$ var將最終包含原始字符串,而pipe命令的結果將被打印到STDOUT。我很好奇直接將管道命令輸出到$ var中,我不認爲這會起作用。我試着用我自己的prog1,prog2來運行這段代碼,但最後它以$ var結尾,只包含原始的連接輸入字符串。 – si28719e 2010-04-22 01:41:09

相關問題