Perl:如何将子例程的词法文件句柄作为命名参数传递和使用?

前端之家收集整理的这篇文章主要介绍了Perl:如何将子例程的词法文件句柄作为命名参数传递和使用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用命名参数将词法文件句柄传递给子例程,但以下内容不能编译:
#!/usr/bin/perl -w
use strict;

my $log_fh;
my $logname = "my.log";

sub primitive {
   my ($fh,$m) = @_;
   print $fh $m;
}

sub sophisticated {
   my ($args) = @_;
   print $args->{m};
   print $args->{fh} $args->{m} ;
}

open $log_fh,">",$logname;

print $log_fh "Today I learned ...\n";

primitive($log_fh,"... the old way works ...\n");

sophisticated({
   fh=>$log_fh,m=>"... and the new way requires an intervention by SO.",});
close $log_fh;

投诉是:

Scalar found where operator expected at ./lexical.file.handle.pl line 15,near
} $args"
(Missing operator before  $args?)

$perl --version

This is perl,v5.10.1

它适用于O.K.当我使用传递参数的原始技术时,命名参数哈希技术适用于消息部分,而不是文件句柄部分.我需要新版本的打印吗?

解决方法

如果你有一个返回文件句柄的复杂表达式(比如$args-> {fh}),你需要通过添加一些额外的curlies来消除语法歧义:
print { $args->{fh} } $args->{m};

这是由于打印操作符设计的奇怪方式,文件句柄和要打印的东西列表之间没有逗号.

或者,您可以先从参数hashref中获取文件句柄,例如

my $fh = $args->{fh};
print $fh $args->{m};
原文链接:https://www.f2er.com/Perl/171946.html

猜你在找的Perl相关文章