【问题标题】:Filehandle Quirk Perl文件句柄怪癖 Perl
【发布时间】:2013-07-11 17:53:53
【问题描述】:

在下面的代码中如果printf语句中FILE(之间有空格 喜欢

printf FILE ("Test string inline\n");

Perl 会将FILE 视为文件句柄,否则

printf FILE("Test string inline\n");

将被视为子程序调用(如果 FILE perl 没有定义子程序,则会出现错误 Undefined subroutine &main::FILE called at ./test.pl line xx )。 Perl 没有更好的方法来实现这一点吗? (也许这就是为什么裸字文件句柄被认为是过时的?)

#!/usr/bin/perl

use warnings;

open(FILE,">test.txt");
printf FILE ("Test string inline\n");
close(FILE);


sub FILE
{
    return("Test string subroutine\n");
}

【问题讨论】:

  • 使用print(FILE "String")print FILE "String"
  • Barewords 文件句柄被认为是过时的,因为它们引用了全局变量。
  • 您能改写一下这个问题吗?这是无法回答的。您从谈论 Perl 语法到询问是否可以改进某些未提及的实现,而没有提及应该衡量这种改进的指标。

标签: perl file filehandle


【解决方案1】:

您是在问如何意外避免该错误?您可以将手柄包裹在卷曲中

printf({ HANDLE } $pattern, @args);
print({ HANDLE } @args);
say({ HANDLE } @args);

或者因为 sayprintprintf 经常省略括号,

printf { HANDLE } $pattern, @args;
print { HANDLE } @args;
say { HANDLE } @args;

或者你可以使用方法调用

HANDLE->printf($pattern, @args);
HANDLE->print(@args);
HANDLE->say(@args);

【讨论】:

  • 是的。我试图避免这种情况发生。
  • 为防止错误发生,请不要在代码中放置语法错误。
【解决方案2】:

试试:

#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short );
use English qw( -no_match_vars ) ;  # Avoids regex performance penalty

my $test_file = 'test.txt';

open my $test_fh, '>', $test_file      or die "could not open $test_file: $OS_ERROR\n";
printf {$test_fh} "Test string inline" or die "could not print $test_file: $OS_ERROR\n";
close   $test_fh                       or die "could not close $test_file: $OS_ERROR\n";

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多