无限循环中的eof

时间:2013-07-18 06:42:41

标签: perl eof

当我检查eof条件是否为假时,它将进入无限循环。 这就是我在做的事情。

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;
    }
}

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

Tie::File将文件显示为数组,我会非常谨慎地使用eof(以及tellseek在绑定的阵列上。模块的文档没有说明这些函数,你不应该假设任何东西,因为当你写$lines[$i]时,数据可能会从缓存中返回,并且与从文件中读取的最后一行完全不同。

我会利用数组的属性,并简单地写

last if $i == $#lines

保证可以正常工作,因为绑定数组的大小与文件中的loines数量一致。事实上,通过将测试放在$i循环中for的值,可以更好地编写整个循环。

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;