in reply to print a file from Bottom to Top (reverse order)

I want to go with while loop.
Why? Given what you're doing in your second code sample, you could do it as well on the items of the @file array in your first code sample.

For example:

open(FILE, "<myfile.txt"); @file = reverse <FILE>; foreach (@file) { chomp; # --> Note: no need to chomp, i +t just forces you to add the \n again when you print next unless /\S/; # skip blank lines --> Note: this is useless giv +en that you print only line matching the /Passed CLEAN/ pattern if (/Passed CLEAN/) { #search string Passed CLEAN print "$_ \n"; # print ALL lines containing Passed CLEAN } }
Or, simplifying a bit the syntax:
open(FILE, "<myfile.txt"); @file = reverse <FILE>; foreach (@file) { print if /Passed CLEAN/; }
That should work fine unless your file is truly huge and won't fit into memory. If your file is too big, then the File::ReadBackwards is the only simple solution;

Replies are listed 'Best First'.
Re^2: print a file from Bottom to Top (reverse order)
by theravadamonk (Scribe) on Jun 20, 2018 at 18:29 UTC

    Thank you very much for your code. it works as expected. my file is actually maillog file. It's sometimes huge. So File::ReadBackwards is much better. But, the problem is I am trying to insert below lines in to that code.

    if (/Passed CLEAN/) { #search string Passed CLEAN print "$_ \n"; # print ALL lines containing Passed CLEAN }

    But, still no success. I am learning perl. I am still a novice. I googled how to insert it, But, still not lucky.

      Changing just a couple of small things to haukex's solution above should give you what you need:
      use warnings; use strict; use File::ReadBackwards; my $bw = File::ReadBackwards->new('/var/log/maillog') or die $!; while (defined( my $line = $bw->readline )) { print $line if $line =~ /Passed CLEAN/; } $bw->close;

        Thanks a lot for your kind reply. I get what I expect from your INPUT. I thank all who participated in this mail tread.

      Given Laurent_R's comprehensive reply, let's move on to the next question: How do I match one or more arbitrary whitespace characters between the  'Passed' and the  'CLEAN' in the pattern match? Please see the  + quantifier in perlre, and  \s in perlre and Whitespace in perlrecharclass. In general, please see perlretut.


      Give a man a fish:  <%-{-{-{-<