Why does my -p one-liner print the lines I'm trying to skip?

perl

Solution

Your expectation is wrong. The `-p` switch puts the following loop around your code:

LINE:
  while (<>) {
      ...             # your program goes here
  } continue {
      print or die "-p destination: $!\n";
  }

If you read the documentation for `next`, it says:

Note that if there were a `continue` block on the above, it would get executed even on discarded lines.

`next` actually jumps to the continue block (if any), before it goes back to the loop's condition.

You could do something like

perl -pe '$_ = "" unless /one/' file

Problem

I have a file named file with three lines: line one line two line three When I do this: perl -ne 'print if /one/' file I get this output: line one when i try this: perl -pe 'next unless /one/' file the output is: line one line two line tree I expected the same output with both one-liner. Are my expectations wrong or is wrong something else?

Original source