2013-07-18 107 views
-1

當我檢查eof條件爲false時,它進入無限循環。 這是我正在做的。eof perl-進入無限循環

tie my @lines, 'Tie::File' , "abc.txt" or die; 

for (my $i=0; ; $i++) { 
    # if I put if(!eof())condition instead of the below one, 
    # it goes in infinite loop. May I know why? 
    if ($lines[$i] =~ /^[\s]*hello/) { 
    splice @lines, $i, 1, "#$lines[$i]", "hi"; 
    last; 
    } 
    #Below eof condition is working 
    if(eof){ 
     last; 
    } 
} 
+0

嗯,你肯定for循環沒有任何問題? – squiguy

+0

我想不是。因爲下面的eof條件工作得很好。 –

+0

我認爲這是給你的問題嗎? – innaM

回答

3

沒有參數的eof使用最後讀取的文件。使用空括號使用eof()是非常不同的。它是指從命令行上列出的文件形成的僞文件,並通過<>運算符進行訪問。

編輯:

通常情況下你不需要使用eof,因爲輸入運營商通常返回undef當他們跑出來的數據,或者出現錯誤。

CODE:

也許問題是,你不使用for循環的第二個條件。

tie my @lines, 'Tie::File' , "abc.txt" or die; 

for(my $i=0;$i<=$#lines; $i++) { 
    if ($lines[$i] =~ /^[\s]*hello/){ 
     splice @lines, $i, 1, "#$lines[$i]", "hi"; 
     last; 
    } 
} 
+0

但是我需要在我的程序中給出eof條件,對吧?否則它會進入無限循環。 –

+0

那麼,當你告訴我你真正想做什麼時,我可以給你一個更好的解決方案來擺脫完整的'eof'問題。 – 2013-07-18 07:29:12

+0

也許只需要鏈接到Tie :: File的文檔。那些文檔相當不錯。實際上,只瀏覽概要應該這樣做。 – innaM

1

Tie::File提出了一個文件作爲陣列,我會非常謹慎一道排在並列陣列上使用eof(和tellseek爲此事)的。模塊的文檔中沒有提到這些函數,你不應該假設任何東西,因爲當你編寫$lines[$i]時,數據可能從緩存中返回,並且與從文件中讀取的最後一行完全不同。

我會利用陣列的性能,以及簡單的寫

last if $i == $#lines 

這是保證工作,因爲綁數組的大小與文件中loines數量持續變化。事實上,通過在for循環中對$i的值進行測試,整個循環可以寫得更好,就像這樣。

for (my $i = 0; $i < @lines; ++$i) { 
    if ($lines[$i] =~ /^[\s]*hello/) { 
    splice @lines, $i, 1, "#$lines[$i]", "hi"; 
    last; 
    } 
} 

,或者可能使用List::MoreUtils

use strict; 
use warnings; 

use List::MoreUtils 'first_index'; 
use Tie::File; 

tie my @lines, 'Tie::File' , "abc.txt" or die $!; 

my $i = first_index { /^\s*hello/ } @lines; 
splice @lines, $i, 1, "#$lines[$i]", "hi" if $i >= 0;