gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:33:39 25 4
gpt4 key购买 nike

我想使用命名参数将词法文件句柄传递给子例程,但以下内容无法编译:

#!/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

它工作正常当我使用传递参数的原始技术时,命名参数哈希技术适用于消息部分,而不适用于文件句柄部分。我需要新版本的 print 吗?

最佳答案

当您有一个返回文件句柄的复杂表达式(如 $args->{fh} )时,您需要通过添加一些额外的花括号来消除语法歧义:

print { $args->{fh} } $args->{m};

这是由于 print 的奇怪方式运算符被设计为在文件句柄和要打印的内容列表之间没有逗号。

或者,您可以先从参数 hashref 中获取文件句柄,例如
my $fh = $args->{fh};
print $fh $args->{m};

关于Perl:如何将词法文件句柄作为命名参数传递和使用给子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120443/

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