2012-01-10 10 views
3

IO::Pipe perlコンストラクタで使用される引数は何ですか?PerlのIO :: Pipeコンストラクタの引数は何ですか?

私がドキュメントに表示することです:

IO ::パイプ::新しいオプションでは、ハンドル::オブジェクトがIOに祝福されるべきで二つの引数をとり、またはそのサブクラス。これらの2つのオブジェクトは、パイプへのシステムコールに使用されます。引数が指定されていない場合、メソッドハンドルは新しいIO :: Pipeオブジェクトで呼び出されます。

私はそれが意味するものを実際には得られません。誰かが例文/説明を提供できますか?

答えて

1

オブジェクト指向プログラミングを学ぶのは簡単です。適切な教材の推奨事項については、Stack Overflowアーカイブを参照してください。以下の説明に従うには、blessがハッシュループでのみ機能するわけではないことに注意する必要があります。

また、POSIXシステムコールが何をするのか、そしてCとPerlのファイル記述子とそれが指すことができるすべてのものと、FDがPerlでどのように渡されているかグロブこれらの部分も混乱している場合は、別の質問を開いてこれを参照してください。

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

TL; DRバージョン:$reader$writerがファイルであることが予想されるが、あなたや他の何かがopen機能やIO::Fileインスタンスから最も可能性が高い、以前オープンしたハンドル。このドキュメントでは、IO :: Handleについて言及しています。なぜなら、適切なファイルではなく、特定のプロセスに接続された標準ストリーム(STDIN、STDOUT)であるFDをパイプしたいからです。


詳細バージョン:

$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オブジェクトの仕組みを知っていますが、このマニュアルの正確な言い回しは私にとっては何となく不明です。一度私は時間があれば、私はそれを読んで、うまくいけば答えを受け入れるでしょう。 –

0

man 3p pipe参照:

パイプ()関数は、パイプを作成し、引数fildesが中に2つのファイル ディスクリプタ1つずつを配置しなければならない[0]とfildesは[1]、 オープンを参照すること読み取りと書き込みのファイル記述はパイプの で終了します。

お試しください。

+0

děkujuzaodpověďazdravím。:-) –

関連する問題