-1

当我检查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;
    }
}
4

2 回答 2

3

eof带参数的使用最后读取的文件。使用eof()空括号是非常不同的。它是指由命令行中列出的文件形成并通过<>操作符访问的伪文件。

编辑:

通常您不需要使用eof,因为输入运算符通常undef在数据用完或出现错误时返回。

代码:

也许问题是,您没有使用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;
    }
}
于 2013-07-18T07:02:05.387 回答
1

Tie::File将文件呈现为数组,我会非常警惕在绑定数组上使用eof(以及tell就此seek而言)。该模块的文档没有说明这些函数,您不应该假设任何事情,因为当您写入$lines[$i]数据时可能会从缓存中返回,并且与从文件中读取的最后一行完全不同。

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

last if $i == $#lines

这可以保证工作,因为捆绑阵列的大小与文件中腰部的数量一致。事实上,通过对循环中的值进行测试,可以更好地编写整个$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;
于 2013-07-18T14:20:44.107 回答