IO::Pipe
perl构造函数中使用了哪些参数?
我在文档中看到的是:
IO :: Pipe :: new可选地接受两个参数,这些参数应该是加载到IO :: Handle或其子类中的对象。这两个对象将用于系统调用管道。如果没有给出参数,则在新的IO :: Pipe对象上调用方法句柄。
我真的不明白这意味着什么。有人可以提供示例/解释吗?
答案 0 :(得分:1)
一旦学习面向对象的编程,它就会直截了当。有关适当教学材料的建议,请参阅Stack Overflow存档。要遵循以下说明,您需要记住bless
不仅适用于hashrefs。
您还应该已经完全理解底层pipe
POSIX系统调用的作用,以及C和Perl中的文件描述符是什么以及它可以指向的所有类型的东西,以及FD如何传递在Perl中作为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
是-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(“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
答案 1 :(得分:0)
请参阅man 3p pipe
:
pipe()函数应创建一个管道并放置两个文件 描述符,分别为fildes [0]和fildes [1]中的一个, 它指的是读写结束的打开文件描述 管道。
试试看。