文件句柄怪癖 Perl
Posted
技术标签:
【中文标题】文件句柄怪癖 Perl【英文标题】:Filehandle Quirk 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 语法到询问是否可以改进某些未提及的实现,而没有提及应该衡量这种改进的指标。
【参考方案1】:
您是在问如何意外避免该错误?您可以将手柄包裹在卷曲中
printf( HANDLE $pattern, @args);
print( HANDLE @args);
say( HANDLE @args);
或者因为 say
、print
和 printf
经常省略括号,
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";
【讨论】:
以上是关于文件句柄怪癖 Perl的主要内容,如果未能解决你的问题,请参考以下文章