代码之家  ›  专栏  ›  技术社区  ›  Thomas L Holaday

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

  •  7
  • Thomas L Holaday  · 技术社区  · 14 年前

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

    当我使用传递参数的原始技术,命名参数散列技术适用于 部分,只是不适合 文件句柄 部分。我需要新版本的吗 打印 ?

    2 回复  |  直到 14 年前
        1
  •  17
  •   friedo    14 年前

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

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

    这是因为 print

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

    my $fh = $args->{fh};
    print $fh $args->{m};
    
        2
  •  4
  •   Community CDub    7 年前

    friedo's answer

    sub sophisticated {
       my %arg = @_;
       print $arg{m};
       print {$arg{fh}} $arg{m};
    }
    
    sophisticated(fh => $log_fh, m => "Hello, world!\n");