http://www.perlmonks.org?node_id=1223318


in reply to truth in while condition

No while is magic, please check the Perldoc in perlsyn.

> If the condition expression of a while statement is based on any of a group of iterative expression types then it gets some magic treatment. The affected iterative expression types are readline, the<FILEHANDLE> input operator,readdir, glob, the <PATTERN>globbing operator, and each. If the condition expression is one of these expression types, then the value yielded by the iterative operator will be implicitly assigned to $_. If the condition expression is one of these expression types or an explicit assignment of one of them to a scalar, then the condition actually tests for definedness of the expression's value, not for its regular truth value.

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^2: truth in while condition
by haukex (Chancellor) on Sep 30, 2018 at 17:05 UTC
      Yeah I took it from .Pl because my old mobile isn't up to date on certificates and is blocked from Perl.org.

      Honestly I was surprised about the new detailed explanation

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^2: truth in while condition
by ikegami (Pope) on Oct 02, 2018 at 02:55 UTC

    Even if it wasn't magical, it still wouldn't stop at that line. The two-character string being returned, 0␊, is true. The magic only matters when the last line of the file consists of a 0 without a terminating Line Feed. (It could also happen when $/ = \1;.)

    (Oops, the main point of this has already been mentioned a couple of times below, though this post still brings in new information.)

      (solved, see update)

      > (It could also happen when $/ = \1; )

      This splits on single characters, including \n.

      But I couldn't find this behavior documented, neither in perlvar#$INPUT_RECORD_SEPARATOR nor readline

      use strict; use warnings; use feature 'say'; $/ = \1; while ( $_= <DATA>) { say "<$_>"; } __DATA__ 1 0 345

      --->

      <1> < > <0> < > <3> <4> <5> < >

      update

      oops I misread \1 as "\1" (ASCII 01), but it's a ref to literal 1, so this from perlvar applies:

      > Setting $/ to a reference to an integer, scalar containing an integer, or scalar that's convertible to an integer will attempt to read records instead of lines, with the maximum record size being the referenced integer number of characters.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^2: truth in while condition
by TISON (Acolyte) on Sep 30, 2018 at 11:31 UTC
    Thank you very much!