2012-04-02 81 views
-2

我運行下面的代碼:Perl的 - 文件啜問題

open my $fh, "<", $file; 

$/ = undef; 
my $report = <$fh>; 
$/ = "\n"; 

close $fh; 

print("$report\n\n"); 

$文件是指看起來像這樣的文本文件:

a 1 
b 2 
c 3 

我跑了兩個不同的Linux驗證碼框。其中一個給了我預期的輸出(就像它在文本文件中出現的一樣)。其他人給我這個:

GLOB(0x80f1174) 

...這有效地阻止我進一步操作的內容。

我檢查了Perl版本 - 一個給我預期的輸出是5.10,而另一個是5.8。但是,在過去的5.8版本中,我對相似的文件執行了完全相同的代碼。

我也試過將文件從DOS轉換爲UNIX:set ff = unix,但無濟於事。

+1

如果第4行表示'my $ result = $ fh'而不是'my $ result = <$fh>',那麼您將得到類似於'GLOB(0x80f1174)'的輸出。 – mob 2012-04-02 15:41:35

+0

@mob我仔細檢查了我的代碼 - 它使用的是<$fh>。 – kaspnord 2012-04-02 15:47:25

+0

@ kaspnord,然後三重檢查。也許你沒有執行你認爲正在執行的文件。 – ikegami 2012-04-02 16:03:04

回答

0

是的,寫

<$fh> 

爲$跳頻會導致錯誤,因爲$ FH僅僅是文件句柄。打印它將等同於打印參考。如下面的代碼,寫爲FH會導致運行時錯誤。

open FH,$infile or die$!; 
while(<FH>){ 
    @line=split(/,/); 
    if($flag==0){ 
    foreach my $col (@line){ 
     $header{$col}=$count; 
     $count++; 
    } 
} 
} 
close(FH); 
4

破碎的文件不包含

my $report = <$fh>; # aka: readline($fh) 

也許它包含

my $report = $fh; 
my $report = < $fh >; # aka: glob(" $fh ") = " GLOB(0xXXXXXXX) " 
my $report = <$fh >; # aka: glob("$fh ") = "GLOB(0xXXXXXXX) " 
my $report = < $fh>; # aka: glob(" $fh") = " GLOB(0xXXXXXXX)" 

<>readlineglob(輸出沒有關係詞GLOB)的快捷方式。空間使它變成glob

+0

對不起,我不明白你的意思是我的文件可能包含<$fh>的變體 - 你能解釋一下嗎?我不知道<$fh>的變體甚至存在... – kaspnord 2012-04-02 16:16:12

+0

請參閱[「perlop中的I/O操作符」部分](http://search.cpan.org/perldoc?perlop#I/O_Operators) – mob 2012-04-02 16:52:13

+0

@kaspnord,我在猜測你的文件包含什麼,因爲它不包含你所說的。 – ikegami 2012-04-02 18:04:13

1

我會推薦使用CPAN的File::Slurp模塊。然後你的代碼可能看起來像這樣:

use File::Slurp 'read_file'; 
my $file = '/path/to/some/file'; 
my $report = read_file $file; 
print("$report\n\n"); 

IMO更具可讀性和可預測性。

0

一個可以使用的文件::嘟嘟地喝爲Hercynium建議,更接近什麼OP貼貌似機制:

my $report = do { 
    open my $fh, '<', $file; 
    local $/; 
    <$fh>; 
}; 

完成後這種方式,所有的變化都是本地的do塊,包括關閉文件句柄。

N.B. perldoc -f do告訴我們

做BLOCK

不是一個真正的功能。返回由BLOCK指示的 命令序列中最後一個命令的值。

還需要注意的一次比一次執行的語句的上下文是do block(這裏標量)的範圍內。我發現do塊非常有用(和利用不足);他們是一個很好的方法來讓詞彙執行塊,但仍然很容易返回到外部範圍。