当我检查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;
}
}
答案 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
(以及tell
和seek
在绑定的阵列上。模块的文档没有说明这些函数,你不应该假设任何东西,因为当你写$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;