IO::Pipe
perl构造函数中使用的参数是什么?从文档中可以看到:
我不太明白它的意思。有人能提供一个例子或解释一下吗?
IO::Pipe::new
可以选择接受两个参数,这两个参数应该是被祝福为 IO::Handle 或其子类的对象。这两个对象将用于调用系统管道。如果没有给出参数,则新的 IO::Pipe 对象会调用 method handles。
IO::Pipe
perl构造函数中使用的参数是什么?我不太明白它的意思。有人能提供一个例子或解释一下吗?
IO::Pipe::new
可以选择接受两个参数,这两个参数应该是被祝福为 IO::Handle 或其子类的对象。这两个对象将用于调用系统管道。如果没有给出参数,则新的 IO::Pipe 对象会调用 method handles。
一旦你学会了面向对象编程,这就很简单了。请参考 Stack Overflow 存档以获取适当的教材推荐。为了理解下面的解释,你需要记住 bless
不仅适用于哈希引用。
你还应该完全理解底层 pipe
POSIX 系统调用的作用,以及在 C 和 Perl 中文件描述符的含义以及它可以指向的各种事物,以及在 Perl 中如何将 FD 作为 glob 传递。如果这些部分也让你感到困惑,请提出单独的问题并引用此问题。
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
是一个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
请参阅man 3p pipe
:
pipe()函数将创建一个管道,并将两个文件描述符放置在参数fildes[0]和fildes[1]中,分别引用管道的读和写端的打开文件描述符。
尝试一下就知道了。