2013-07-11 98 views
0

在下面的代碼,如果沒有在printf聲明 FILE(之間的空間像文件句柄夸克的Perl

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"); 
} 
+2

使用'print(FILE「字符串」)或'print FILE「字符串」'。 – choroba

+3

Barewords文件句柄被認爲是過時的,因爲它們引用了全局變量。 – ikegami

+0

你可以重新解釋一下這個問題嗎?這是無法回答的。你從談論Perl語法到詢問是否可以改進一些未提及的實現,而沒有提及衡量這種改進的度量標準。 – ikegami

回答

3

你問如何避免錯誤意外?你可以包裹在花括號手柄

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); 
+0

是的。我試圖避免這種情況發生。 – Jean

+3

爲防止發生錯誤,請不要在代碼中放置語法錯誤。 – ikegami

0

嘗試:

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