2013-07-18 75 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;