Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # usage: build_index(*DATA_HANDLE, *INDEX_HANDLE)
- sub build_index {
- my $data_file = shift;
- my $index_file = shift;
- my $offset = 0;
- while (<$data_file>) {
- print $index_file pack("N", $offset);
- $offset = tell($data_file);
- }
- }
- # usage: line_with_index(*DATA_HANDLE, *INDEX_HANDLE, $LINE_NUMBER)
- # returns line or undef if LINE_NUMBER was out of range
- 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("N", 0));
- $i_offset = $size * ($line_number-1);
- seek($index_file, $i_offset, 0) or return;
- read($index_file, $entry, $size);
- $d_offset = unpack("N", $entry);
- seek($data_file, $d_offset, 0);
- return scalar(<$data_file>);
- }
- use Config qw( %Config );
- my $off_t = $Config{lseeksize} > $Config{ivsize} ? 'F' : 'j';
- ...
- print $index_file pack($off_t, $offset);
- ...
Add Comment
Please, Sign In to add comment