gpt4 book ai didi

perl - 是否允许将管道传递给构造函数?

转载 作者:行者123 更新时间:2023-12-03 05:33:26 25 4
gpt4 key购买 nike

我尝试用 Perl 做一些非常奇特的事情,但我想我正在承受后果。实际上,我不知道我想做的事情是否可行。

我的主程序创建一个像这样的管道:

pipe(my $pipe_reader, my $pipe_writer);

(最初是管道(PIPE_READER,PIPE_WRITER),但当我尝试调试它时,我更改为常规变量)

然后它 fork ,但我认为这可能与这里无关。 child 这样做:

my $response = Response->new($pipe_writer);

Response 的构造函数是简单的:

sub new {
my $class = shift;
my $writer = shift;

my $self = {
writer => $writer
};
bless($self, $class);
return($self);
}

然后 child 会写下它的回应:

$response->respond(123, "Here is my response");

响应代码如下:

sub respond {
my $self = shift;
my $number = shift;
my $text = shift;
print $self->{writer} "$number\n";
print $self->{writer} "$text\n";
close $self->{writer}
}

这会触发一个奇怪的编译错误:“在运算符期望的位置找到字符串...在“$number\n”之前缺少运算符?”在第一次打印时。当然,这是打印的正常语法,除了我有对象属性而不是普通句柄,而且它恰好是管道,而不是文件句柄。所以现在我想知道是否不允许我这样做。

最佳答案

来自print

If you're storing handles in an array or hash, or in general whenever you're using any expression more complex than a bareword handle or a plain, unsubscripted scalar variable to retrieve it, you will have to use a block returning the filehandle value instead, ...

print { $files[$i] } "stuff\n";
print { $OK ? *STDOUT : *STDERR } "stuff\n";

(我的重点)

所以你需要

print { $self->{writer} } "$number\n";
<小时/>

或者,根据Borodin的评论

$self->{writer}->print("$number\n");

print 的语法比较特殊,例如 this postthis post 。首先,在 print 之后必须出现一个“简单”文件句柄或一个 block ,如上面引用的那样,以满足解析器的要求。

但是有了 dereference (arrow) operator发现文件句柄是 IO::File object 以及其父对象的 IO::Handle::print方法被调用。在 v5.14 之前,必须 use IO::Handle; 才能正常工作,但现在已经不行了。请参阅this post以及其中的链接以了解更多信息。

请注意,print FILEHANDLE LIST 不是 indirect method call ,即使看起来如此。它只是在相当特殊的语法规则下对内置 print 的函数调用。它仅具有显式的 ->调用 IO::Handle 方法。

<小时/>

它要么在遇到方法调用(并失败)时被祝福到类中,要么在创建时被祝福;我无法在文档中找到它,也无法以其他方式解决文件句柄是在创建时还是按需使用的问题

perl -MScalar::Util=blessed -wE'
pipe(RD,WR);
say *WR{IO}; #--> IO::File=IO(0xe8cb58)
say blessed(WR)//"undef"; #--> undef
'

(警告未使用的 RD)我们无法使用词法文件句柄执行此操作,因为它们不在符号表中。

但是一旦需要文件句柄一个IO::FileIO::Handle对象(取决于Perl版本)。

关于perl - 是否允许将管道传递给构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com