在IO::Pipe
perl构造函数中使用了什么参数?Perl中IO :: Pipe构造函数的参数是什么?
我在文档中看到的是:
IO ::管::新的可选有两个参数,应该祝福的对象为IO ::处理,或者其子类。这两个对象将用于系统调用管道。如果没有给出参数,则在新的IO ::管道对象上调用方法句柄。
我真的不明白这意味着什么。有人可以提供一个例子/解释吗?
在IO::Pipe
perl构造函数中使用了什么参数?Perl中IO :: Pipe构造函数的参数是什么?
我在文档中看到的是:
IO ::管::新的可选有两个参数,应该祝福的对象为IO ::处理,或者其子类。这两个对象将用于系统调用管道。如果没有给出参数,则在新的IO ::管道对象上调用方法句柄。
我真的不明白这意味着什么。有人可以提供一个例子/解释吗?
一旦你学习了面向对象的编程,它就直截了当。请参阅堆栈溢出存档以获取适当教材的建议。要遵循下面的解释,您需要记住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
参见man 3p pipe
:
管道()功能必须创建管道和放置两个文件 描述符,一个每次进参数法尔兹[0]和法尔兹[1], 引用该开读取和写入的文件描述结束 管道。
试试看。
děkujuzaodpověďazdravím。:-) – 2012-01-10 09:06:47
这是一个很好的答案,谢谢。我确实知道perl对象的工作方式,但本手册的确切用词对我而言并不明确。一旦我有更多的时间,我会阅读并希望接受答案。 – 2012-01-10 10:16:18