Perl中IO :: Pipe构造函数的参数是什么?

时间:2012-01-10 04:55:09

标签: perl

IO::Pipe perl构造函数中使用了哪些参数?

我在文档中看到的是:

  

IO :: Pipe :: new可选地接受两个参数,这些参数应该是加载到IO :: Handle或其子类中的对象。这两个对象将用于系统调用管道。如果没有给出参数,则在新的IO :: Pipe对象上调用方法句柄。

我真的不明白这意味着什么。有人可以提供示例/解释吗?

2 个答案:

答案 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]中的一个,   它指的是读写结束的打开文件描述   管道。

试试看。