use File::Tail (); { my $getline; if ($opt{'c'}) { open my $fh, '<', $MAILLOG or die("Unable to open mail log: $!\n"); $getline = sub { return scalar <$fh>; } } else { my $fh = File::MyTail->new(name => $MAILLOG, tail => -1); $getline = sub { return scalar $fh->read(); } } while (defined(my $line = $getline->()) { ...while loop code here... } }