Perl中的IO::Pipe构造函数有哪些参数?

3
IO::Pipe perl构造函数中使用的参数是什么?
从文档中可以看到:

IO::Pipe::new 可以选择接受两个参数,这两个参数应该是被祝福为 IO::Handle 或其子类的对象。这两个对象将用于调用系统管道。如果没有给出参数,则新的 IO::Pipe 对象会调用 method handles。

我不太明白它的意思。有人能提供一个例子或解释一下吗?
2个回答

1

一旦你学会了面向对象编程,这就很简单了。请参考 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

这是一个很好的答案,谢谢。我知道如何使用Perl对象,但是这个手册的确切措辞对我来说有些不清楚。一旦我有更多时间,我会仔细阅读并希望接受这个答案。 - Karel Bílek

0

请参阅man 3p pipe

pipe()函数将创建一个管道,并将两个文件描述符放置在参数fildes[0]和fildes[1]中,分别引用管道的读和写端的打开文件描述符。

尝试一下就知道了。


谢谢您的回复,祝好。 :-) - Karel Bílek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接