in reply to Re: while loop logic
in thread while loop logic

I am intrigued by this answer. Being fairly new to Perl this has opened up a new ball game for me. I have a further question based on the answer you've given.
What happens if all I want to do is to chop out the comment from the fifth field (which is the only one that will ever contain comments) but apply the regex to what remains of the field? e.g.

aaaa|bbbb|cccc|dddd|eeee|some text to check /* a comment qqqq|wwww|eeee|rrrr|tttt| I'm not interested in */ more text to check

Can I do this using your solution ?

Replies are listed 'Best First'.
Re: while loop logic
by jonadab (Parson) on Jan 13, 2006 at 15:39 UTC
    What happens if all I want to do is to chop out the comment from the fifth field (which is the only one that will ever contain comments) but apply the regex to what remains of the field?

    Potentially, if you don't care about the other fields.

    What $/ does is controls where the <> file input operator stops reading. Normally it stops at the end of each line (after the newline character), but with $/ set to "*/", it will stop reading there instead. So with one read you can throw away everything up to that point, let your localized change to $/ fall out of scope at the closing brace so that the behavior of <> is back to normal, and then read the remainder of the field after the end of the comment. You'll miss fields 1-4 as well, since they were already skipped, but you can pick up the 'more text to check' part if there is something you want to do with that. My code as written calls the <> operator once more in void context to throw that and the following newline away, but you could instead assign that to a variable and do something with it.

    However, if you need to save fields 1-4 from the line where the comment ends, then you need to go with the other solution, i.e., keep track of whether you're in a comment or not and act accordingly. In that case if you are in a comment and detect */ in field five you could do two things: clear the comment flag, and remove the part up to the */ from the field. Similarly, if you are not in a comment but detect /* in field 5, you could remove the part starting with /* from the field and either set the comment flag right away (if you don't want to process that line at all) or else set a different flag that causes code at the end of the loop to set the comment flag after the line is processed.

      OK thanks for the reply. This has been an eye-opening experience!