Ahdee
Ahdee

Reputation: 4949

Read specific part of a filehandle in PERL

Hi I have a large file I would like to read. To save resource I want to read it slowly, one line at a time. However I'm wondering if there is a way to read specific line from a filehandle instead. For example, say I have a test.txt file containing a billion numbers starting with 1. Each number is on a separate line.

1
2
3
...

so now what I currently do to get say line 10 is this,

open (FILE, "< test.txt") or die "$!"; 
@reads = <FILE>
print $reads[9]; 

however, is there a way I can access certain part of the FILE without reading everything into a big array, say I want line 10 instead.

something like FILE->[9]

- thanks for helping in advance!

Upvotes: 1

Views: 746

Answers (2)

Miller
Miller

Reputation: 35198

Two methods, do line by line processing your skip to the desired line. You can use the Input Line Number variable, $. to help:

use strict;
use warnings;
use autodie;

my $line10 = sub {
    open my $fh, '<', 'text.txt';
    while (<$fh>) {
        return $_ if $. == 10;
    }
}->();

Alternatively, you could use Tie::File as you already noticed. However, while that interface is very convenient, and I'd recommend it's use, it also will loop through the file behind the scenes.

use strict;
use warnings;
use autodie;

use Tie::File;

tie my @array, 'Tie::File', 'text.txt' or die "Can't open text.txt: $!";

print $array[9] // die "Line 10 does not exist";

Upvotes: 1

morissette
morissette

Reputation: 1099

For memory purposes large files should be read in using a while loop which will read the file line by line:

open my $fh, '<', 'somefile.txt';
while ( my $line = <$fh> ) {
   //read in text line by line
}

Either way to get at that line number you are going to have to read the whole file in. Now I would recommend using the while loop and a counter to print / save the line you are looking for.

Upvotes: 1

Related Questions