Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

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

by graff (Chancellor)
on Jul 31, 2010 at 22:33 UTC ( #852278=note: print w/replies, xml ) Need Help??

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

The description of the problem makes sense, but your guess about having a loop inside a loop is very muddled. And you still haven't shown any of your own code.

By way of a better explanation, your solution should be something called a "state machine", where at any given time your program is in one of a finite set of "states" (it seems like two states will suffice here). Whether or not you print a given line depends on what state you're in, and there are certain lines that will cause a change of state. Make sense? Here's pseudo-code, which is pretty close to a perl solution:

initial state is "0"; while there's a line that you've read from the file { set state to "1" if the current line contains "HW/OS/Client" print the current line if the current state is "1" (true) set state to "0" if the current line is blank (contains only white-sp +ace) }
That should do what you want. Let us know if you have trouble turning that into perl code. (It shouldn't be hard.)

Replies are listed 'Best First'.
Re^5: How to print certain lines out of a text file.
by sawdustar (Novice) on Jul 31, 2010 at 22:48 UTC
    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,'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.
      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".)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://852278]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2017-02-26 02:41 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (371 votes). Check out past polls.