Это просто, когда вы изучаете объектно-ориентированное программирование.См. Архив переполнения стека для рекомендаций соответствующего учебного материала.Чтобы следовать приведенному ниже объяснению, вы должны иметь в виду, что bless
работает не только с хеш-кодами.
Вы также должны полностью понимать, что делает базовый системный вызов POSIX pipe
и что такое файловый дескриптор в C и Perl и на что он может указывать, и как FD передается в Perl как глобус.Если эти части также сбивают с толку, откройте отдельные вопросы и обратитесь к ним.
use IO::Pipe qw();
my $pipe = IO::Pipe->new($reader, $writer);
tl; dr версия: $reader
и $writer
должны быть файловыми дескрипторамиили что-то еще открылось ранее, скорее всего, из функции open
или экземпляра IO::File
.В документации упоминается прежде всего IO :: Handle, потому что, скорее всего, вы также захотите направить FD, которые не являются правильными файлами, но стандартными потоками (STDIN, STDOUT), подключенными к определенным процессам, и для этого достаточно IO :: Handle.
Подробно версия:
Ожидается, что переменные $reader
и $writer
будут содержать экземпляры объектов типа IO::Handle
($reader
is-a 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 («тип утки»), то есть предоставляют некоторые методы, упомянутые в документации, и их не нужно наследовать от 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