in reply to Re^4: How to print certain lines out of a text file.
in thread How to print certain lines out of a text file.

graff, Here's all the code I have so far:
#!/usr/bin/perl use strict; use warnings; my $PolicyName = ""; my $PolicyType = ""; my $ActivePolicy = ""; my $ClientServer = ""; open(INFILE, '<mas01_policy_dump.txt'); while(<INFILE>) { if ($_ =~ "Policy Name") { $PolicyName = $_; #print $line; } if ($_ =~ "Policy Type") { $PolicyType = $_; } if (($_ =~ "Active") && ($_ =~ "yes")) { $ActivePolicy = $_; print $PolicyName; print $PolicyType; print $ActivePolicy; } if ($_ =~ "HW/OS/Client") { while ($_) { next if /^$/; $ClientServer = $_; print $ClientServer; next; } } next; }

Sorry, but I'm reading books and searching the internet while trying to learn about perl and write this script to do what I need done. So, I'm reading, writing, testing, fixing, reading, writing, testing, fixing.....it's a never ending cycle until I figure out how to do what I need done in Perl. I used to write Unix scripts but that's been years ago. I'm learning perl now because some of the production scripts I now have to help support are in Perl.

Replies are listed 'Best First'.
Re^6: How to print certain lines out of a text file.
by graff (Chancellor) on Jul 31, 2010 at 23:08 UTC
    You're very close.

    The nested "while" loop inside your fourth "if" block is wrong. In fact, as written, it will be an infinite loop, because you're not doing anything to change the value of "$_" -- it remains true "forever".

    Just reduce that fourth "if" block to one statement:

    if ($_ =~ "HW/OS/Client") { $ClientServer = $_; }
    Then add two more "if" blocks:
    if ( $ClientServer ) { print; } if ( /^\s*$/ ) { # true when the current line is blank $ClientServer = ""; }
    The point is that your "$ClientServer" variable works just fine as a state variable. Whenever it has any non-empty value, you print the current line of input, otherwise, you don't print. You go over all the lines of input with just the one outer "while" loop, and the various "if" conditions will do the right thing.

    (As shown above, the blank line following the data block of interest will be included in the output. If you don't want the blank line printed, just put that "if" block above the one that does the "print".)