【发布时间】:2010-06-25 18:26:20
【问题描述】:
我想使用命名参数将词法文件句柄传递给子例程,但以下代码无法编译:
#!/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
它工作正常。当我使用传递参数的原始技术时,命名参数散列技术适用于 message 部分,但不适用于 file handle 部分。我需要新版本的 print 吗?
【问题讨论】:
-
你应该改掉预先声明变量的习惯(“my $log_fh;”是不必要的),你应该检查opens的状态。例如:open my $log_fh, ">", $logname or die "Error opening $logname: $!";
标签: perl subroutine