2012-01-10 103 views
3

IO::Pipe perl構造函數中使用了什麼參數?Perl中IO :: Pipe構造函數的參數是什麼?

我在文檔中看到的是:

IO ::管::新的可選有兩個參數,應該祝福的對象爲IO ::處理,或者其子類。這兩個對象將用於系統調用管道。如果沒有給出參數,則在新的IO ::管道對象上調用方法句柄。

我真的不明白這意味着什麼。有人可以提供一個例子/解釋嗎?

回答

1

一旦你學習了面向對象的編程,它就直截了當。請參閱堆棧溢出存檔以獲取適當教材的建議。要遵循下面的解釋,您需要記住bless不僅適用於hashrefs。

你應該已經完全理解底層的pipe POSIX系統調用是幹什麼的,以及C和Perl中的文件描述符以及它可以指向什麼類型的東西以及FD如何在Perl中傳遞爲一個glob。如果這些內容也令人困惑,請打開單獨的問題並參考本文。

use IO::Pipe qw(); 
my $pipe = IO::Pipe->new($reader, $writer); 

TL;博士版本:$reader$writer預計將文件句柄你或別的東西,早前已開通,最有可能從open功能或IO::File實例。該文檔首先提到了IO :: Handle,因爲您可能想要對不是合適文件的FD進行管道連接,而是將標準流(STDIN,STDOUT)連接到某些進程,爲此,IO :: Handle就足夠了。


詳細版本:

$reader$writer變量預期含有IO::Handle類型的對象實例($reader是-一個IO::Handle)。 IO::Handle很少使用,更常見的是其子類IO::File

use IO::File qw(); 
my $reader = IO::File->new('/usr/src/linux/COPYING', 'r'); 
# bless(*Symbol::GEN0 => 'IO::File') 
$reader->fileno 
# 6 
$reader->can('getline') 
# true 

use IO::File::WithPath qw(); 
my $writer = IO::File::WithPath->new('/tmp/foobar', 'w'); 
$writer->fileno 
# 7 
$writer->can('print') 
# true 

由於歷史的原因,很多並不嚴格的IO :: Handle子類的工作也是如此。只要它們的行爲像IO :: Handle(「duck type」)一樣,即提供文檔中提到的一些方法,而不需要從IO :: Handle繼承。

open my $other_reader, '<', '/usr/src/linux/COPYING'; 
# \*{'::$other_reader'} 
$other_reader->fileno; 
# 8 
$other_reader->can('getline'); 
# false, but works anyway, see http://p3rl.org/IO::Handle#BUGS 

use File::Temp qw(tempfile); 
my ($other_writer) = tempfile; 
# \*{'File::Temp::$fh'} 
$other_writer->fileno; 
# 9 
$other_writer->can('print') 
# false, but works anyway, see http://p3rl.org/IO::Handle#BUGS 

use IO::String qw(); 
my $s = IO::String->new("foo\nbar\nbaz"); 
# bless(*Symbol::GEN1 => 'IO::String') 
$s->fileno 
# undef 
$s->can('getline') 
# true 

### TODO 
use File::Map qw(map_handle); 
map_handle my $map, '/boot/vmlinuz'; # ??? 

### TODO some popen examples 
+0

這是一個很好的答案,謝謝。我確實知道perl對象的工作方式,但本手冊的確切用詞對我而言並不明確。一旦我有更多的時間,我會閱讀並希望接受答案。 – 2012-01-10 10:16:18

0

參見man 3p pipe

管道()功能必須創建管道和放置兩個文件 描述符,一個每次進參數法爾茲[0]和法爾茲[1], 引用該開讀取和寫入的文件描述結束 管道。

試試看。

+0

děkujuzaodpověďazdravím。:-) – 2012-01-10 09:06:47

相關問題