Каковы аргументы для конструкторов IO :: Pipe в Perl? - PullRequest
3 голосов
/ 10 января 2012

Какие аргументы используются в IO::Pipe конструкторах perl?

Что я вижу в документации:

IO :: Pipe :: new необязательно принимает два аргумента, которые должны быть объектами, благословленными в IO :: Handle или его подклассе. Эти два объекта будут использоваться для системного вызова канала. Если аргументы не указаны, то для нового объекта IO :: Pipe вызывается дескриптор метода.

Я не совсем понимаю, что это значит. Может кто-нибудь привести пример / объяснение?

Ответы [ 2 ]

1 голос
/ 10 января 2012

Это просто, когда вы изучаете объектно-ориентированное программирование.См. Архив переполнения стека для рекомендаций соответствующего учебного материала.Чтобы следовать приведенному ниже объяснению, вы должны иметь в виду, что 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
0 голосов
/ 10 января 2012

См. man 3p pipe:

Функция pipe () должна создать канал и поместить два файла дескрипторы, по одному в аргументы fildes [0] и fildes [1], которые ссылаются на описания открытых файлов для чтения и записи заканчивается трубы.

Попробуй посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...