オブジェクト指向プログラミングを学ぶのは簡単です。適切な教材の推奨事項については、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
これは素晴らしい回答です、ありがとうございます。私はperlオブジェクトの仕組みを知っていますが、このマニュアルの正確な言い回しは私にとっては何となく不明です。一度私は時間があれば、私はそれを読んで、うまくいけば答えを受け入れるでしょう。 –