FreeKB - Print previous, current, and next line in a file in Perl (seek, tell)
Print previous, current, and next line in a file in Perl (seek, tell)

Home > Search


Let's say you have a file (fruit.txt) that contains fruit. The seek and tell operators can be used to get the previous and next lines in a file.

apple
pineapple
orange
grapes

 


TELL

The tell operator simply determine the current position in a file. 

#!/usr/bin/perl

use strict;
use warnings;

my $file = "fruit.txt";

open (FH, "<", $file) or die "cannot open $file $! \n";

while (my $line = <FH>) {
  my $current_position = tell FH;
  print "$current_position $line\n";
}

close FH;

 

This will produce the following results. While in the first loop, the cursor was at position 6 (the new line following the word apple).

6  apple
16 pineapple
23 orange
30 grapes

 


SEEK

The seek operator is used to go to a certain position in the file. For example, the following would move you to 0:0, which is the very first character in the file, which is the letter "a" in apple in this example. The first 0 means "byte 0" and the second 0 means "from the beginning of the file". Or, you could use SEEK_SET instead of 0 to start at the beginning of the file. 

seek FH, 0, 0;
seek FH, 0, SEEK_SET;

 

Or to move to position 7 (the first letter "p" in pineapple). The 7 means "byte 7" and the 0 means "from the beginning of the file". Or, another way to describe this is "starting at the beginning of the file, move to the 7th byte in the file".

seek FH, 7, 0;

 

This script will loop through each line in fruit.txt and will print the previous line, current line, and next line.

#!/usr/bin/perl

use strict;
use warnings;

my $file = "fruit.txt";

open (FH, "<", $file) or die "cannot open $file $! \n";

my $starting_current_position = tell FH;
my $ending_current_position  = tell FH;
my $previous_position        = undef;
my $previous_line            = undef;

while (my $current_line = <FH>) {

  chomp $current_line;

  $starting_current_position = tell FH;

  print "previous position          = $previous_position\n";
  print "starting current position  = $starting_current_position\n";
  print "ending current position    = $ending_current_position\n";

  if (defined $previous_position) {
    seek FH, $previous_position, 0;
    $previous_line = <FH>;
    chomp $previous_line;
    seek FH, $starting_current_position, 0;
  }

  my $next_line = <FH>;
  chomp $next_line;
  seek FH, $starting_current_position, 0;

  print "previous line = $previous_line\n";
  print "current line  = $current_line\n";
  print "next line     = $next_line\n";

  $previous_position = $ending_current_position;
  $ending_current_position = tell FH;
}

close FH;

 

Running this script will produce the following output.

previous line = 
current line  = apple
next line     = pineapple

previous line = apple
current line  = pineapple
next line     = orange

previous line = pineapple
current line  = orange
next line     = grapes

previous line = orange
current line  = grapes
next line     = 

 



Add a Comment




We will never share your name or email with anyone. Enter your email if you would like to be notified when we respond to your comment.




Please enter 76714 in the box below so that we can be sure you are a human.




Comments