gpt4 book ai didi

perl - 在 Perl 中为文件建立索引

转载 作者:行者123 更新时间:2023-12-01 03:50:45 25 4
gpt4 key购买 nike

我目前是 Perl 的新手,我偶然发现了一个问题:

我的任务是创建一种简单的方法来访问 Perl 中的一行大文件,这是可能的最快方法。
我创建了一个由 500 万行组成的文件,每行都有行号。
然后我创建了我的主程序,该程序需要能够打印给定行的任何内容。
为此,我使用了在互联网上找到的两种方法:

use Config qw( %Config );

my $off_t = $Config{lseeksize} > $Config{ivsize} ? 'F' : 'j';
my $file = "testfile.err";
open(FILE, "< $file") or die "Can't open $file for reading: $!\n";
open(INDEX, "+>$file.idx")
or die "Can't open $file.idx for read/write: $!\n";
build_index(*FILE, *INDEX);
my $line = line_with_index(*FILE, *INDEX, 129);
print "$line";

sub build_index {
my $data_file = shift;
my $index_file = shift;
my $offset = 0;

while (<$data_file>) {
print $index_file pack($off_t, $offset);
$offset = tell($data_file);
}
}

sub line_with_index {
my $data_file = shift;
my $index_file = shift;
my $line_number = shift;

my $size; # size of an index entry
my $i_offset; # offset into the index of the entry
my $entry; # index entry
my $d_offset; # offset into the data file

$size = length(pack($off_t, 0));
$i_offset = $size * ($line_number-1);
seek($index_file, $i_offset, 0) or return;
read($index_file, $entry, $size);
$d_offset = unpack($off_t, $entry);
seek($data_file, $d_offset, 0);
return scalar(<$data_file>);
}

这些方法有时有效,我在十次尝试不同的值时得到一个值,但大多数时候我得到“在 test2.pl 行 10 处使用未初始化的值 $line in string”(在查找第 566 行时)文件)或不是正确的数值。此外,索引似乎在前两百行左右工作正常,但之后我得到了错误。我真的不知道我做错了什么..

我知道你可以使用一个基本的循环来解析每一行,但我真的需要一种在任何给定时间访问文件的一行而不需要重新解析的方法。

编辑:我试过使用这里找到的一个小技巧: Reading a particular line by line number in a very large file
我已将 pack 的“N”模板替换为:
my $off_t = $Config{lseeksize} > $Config{ivsize} ? 'F' : 'j';

它使过程更好地工作,直到第 128 行,我得到一个空白字符串而不是 128 。对于 129,我得到 3,这并不意味着什么..

Edit2 :基本上我需要的是一种机制,它使我能够读取接下来的 2 行,例如已经读取的文件,同时将读取的“头”保持在当前行(而不是之后的 2 行)。

谢谢你的帮助 !

最佳答案

由于您正在将二进制数据写入索引文件,因此您需要将文件句柄设置为二进制模式,尤其是在 Windows 中:

open(INDEX, "+>$file.idx")
or die "Can't open $file.idx for read/write: $!\n";
binmode(INDEX);

现在,当您在 Windows 中执行类似操作时:
print $index_file pack("j", $offset);

Perl 会将打包字符串中的任何 0x0a 转换为 0x0d0a。将文件句柄设置为 binmode 将确保换行符不会转换为回车换行符。

关于perl - 在 Perl 中为文件建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23111157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com