2012-01-10 75 views
3

IO::Pipe perl构造函数中使用了什么参数?Perl中IO :: Pipe构造函数的参数是什么?

我在文档中看到的是:

IO ::管::新的可选有两个参数,应该祝福的对象为IO ::处理,或者其子类。这两个对象将用于系统调用管道。如果没有给出参数,则在新的IO ::管道对象上调用方法句柄。

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

回答

1

一旦你学习了面向对象的编程,它就直截了当。请参阅堆栈溢出存档以获取适当教材的建议。要遵循下面的解释,您需要记住bless不仅适用于hashrefs。

你应该已经完全理解底层的pipe POSIX系统调用是干什么的,以及C和Perl中的文件描述符以及它可以指向什么类型的东西以及FD如何在Perl中传递为一个glob。如果这些内容也令人困惑,请打开单独的问题并参考本文。

use IO::Pipe qw(); 
my $pipe = IO::Pipe->new($reader, $writer); 

TL;博士版本:$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(“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 
+0

这是一个很好的答案,谢谢。我确实知道perl对象的工作方式,但本手册的确切用词对我而言并不明确。一旦我有更多的时间,我会阅读并希望接受答案。 – 2012-01-10 10:16:18

0

参见man 3p pipe

管道()功能必须创建管道和放置两个文件 描述符,一个每次进参数法尔兹[0]和法尔兹[1], 引用该开读取和写入的文件描述结束 管道。

试试看。

+0

děkujuzaodpověďazdravím。:-) – 2012-01-10 09:06:47

相关问题