in reply to Print 4 Lines below matching criteria

Update: my apologies - this does not actually work correctly - see replies below.

For something a little more verbose:

#!/usr/bin/perl -w use strict; while (<DATA>) { if (/^id:/) { my ($city, $phone, $street, $zip) = (<DATA>,<DATA>,<DATA>,<DAT +A>); print "$city$phone$street$zip"; } } __DATA__ John, Doe Michael id:1234567890123 library:ACME City, state:PUEBLO, CO Phone:719-555-555 Street:1610 Sorrow AVE APT D Zip: 81004

Prints:

City, state:PUEBLO, CO Phone:719-555-555 Street:1610 Sorrow AVE APT D Zip: 81004

Cheers,
Darren

Replies are listed 'Best First'.
Re^2: Print 4 Lines below matching criteria
by chromatic (Archbishop) on Nov 16, 2006 at 06:43 UTC

    I didn't realize those readline calls would be in scalar context there. How interesting. Very nice!

    Update: I wrote a bad test case at nearly 11 pm. Sorry for the confusion!

      They are not in scalar context. To be in scalar context you would need to do:

      my ( $city, $phone, $street, $zip ) = ( scalar <DATA>, scalar <DATA>, +scalar <DATA>, scalar <DATA> );

        Or the slightly cleaner

        my ( $city, $phone, $street, $zip ) = map scalar <DATA>, 1 .. 4;

        Or the somewhat obscure but useful:

        chomp( my ( $city, $phone, $street, $zip ) = map scalar <DATA>, 1 .. 4 + );

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
        "They are not in scalar context."

        You are absolutely correct!
        And this is the part where I need to put my hand up and admit that I have "cargo-culted" this technique without really taking the time to work out what was really going on.

        I first saw this technique used in some code written by a co-worker some years ago. It was basically used to read a fixed number of lines from a very small configuration file. I adopted it and have used it from time to time to do the same thing. Fortunately, I've never been bitten because I've never used it in a loop to retrieve multiple "sets".

        My apologies to the OP, and thanks for pointing this out.

        Cheers,
        Darren

Re^2: Print 4 Lines below matching criteria
by Anonymous Monk on Nov 16, 2006 at 23:33 UTC
    Darren - Thanks for your help, I used the script you suggested and it works great. DG