Perl中是否允许将管道传递给类构造函数?
解决Perl中对象属性作为print句柄的编译错误
嘿,这个问题我太熟了!咱们先搞清楚为什么会报这个错,然后直接给你解决办法。
错误原因
Perl的print函数对句柄的解析有个小坑:当你用裸字句柄(比如你最初用的PIPE_WRITER)或者简单标量变量(比如$fh)作为句柄时,print $fh "内容"这种写法没问题;但如果句柄是像$self->{writer}这样的复合表达式(哈希元素/对象属性),Perl的语法解析器会懵——它没办法直接识别这是一个句柄,反而会把$self->{writer}和后面的"$number\n"当成两个需要运算符连接的字符串,所以才会抛出'String found where operator expected ... Missing operator before "$number\n"?'的错误。
两种解决方案
方案1:给句柄表达式加大括号
用大括号把对象属性的句柄包起来,明确告诉Perl这是一个单独的句柄参数:
sub respond { my $self = shift; my $number = shift; my $text = shift; print { $self->{writer} } "$number\n"; print { $self->{writer} } "$text\n"; close $self->{writer}; }
这里的大括号是Perl语法要求的,用来标记复合表达式作为print的句柄。
方案2:先把句柄赋值给临时变量
如果觉得大括号看着别扭,也可以先把对象里的句柄存到一个简单标量变量里,再用这个变量调用print:
sub respond { my $self = shift; my $number = shift; my $text = shift; my $fh = $self->{writer}; print $fh "$number\n"; print $fh "$text\n"; close $fh; }
这种写法更直观,Perl能轻松识别$fh是句柄。
补充说明
这个问题和管道本身没关系,不管你存的是管道句柄、文件句柄还是其他IO句柄,只要是作为对象属性(哈希元素)的复合表达式,都需要这么处理。这是Perl语法解析的规则,不是你的逻辑有问题~
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

