我想使用data.txt
读取文本文件read
。
我想一次读取每行的前四个整数。
line1 0101020102
line2 2010201001
line3 0201010201
line1
等是文件的一部分。
这是我到目前为止可以做的
my $data;
my $IN;
my $n = 0;
$line = 1;
open($IN, '<', "data.txt") or die " Error";
while ( $line != 0 ) {
seek($IN, 6, SEEK_SET);
$line = read($IN, $data, 4);
seek($IN, 0, SEEK_SET);
}
问题是,使用while
循环,Perl会无限循环地读取第一行。
我该如何解决这个问题?
答案 0 :(得分:2)
我认为您误解了seek()
的功能。使用SEEK_SET
作为第三个参数,第二个参数被解释为从文件开头开始测量的要移动的位置。因此,每次运行此行:
seek($IN, 6, SEEK_SET);
它总是移动到文件中的第七个位置(显然,它总是在同一行上)。然后,当您运行以下行时:
seek($IN, 0, SEEK_SET);
它总是移回文件的开头。
最初,我认为解决方案是将SEEK_SET
更改为SEEK_CUR
(它将第二个参数解释为相对于当前位置的移动量),但是要复杂得多。这是我的工作方式:
seek($IN, 6, SEEK_CUR); # Move forward six spaces
$line = read($IN, $data, 4);
seek($IN, 7, SEEK_CUR); # Move forward seven places
但是实际上,正则表达式是最好的方法。
while(<$IN>) {
($data) = /\s(\d{4})/;
print "$data\n";
}