in reply to Re^3: how do I "initialize" $_
in thread how do I "initialize" $_

... with strict; and warnings; active, when reading from the predefined DATA file handle, you will get a warning if you don't have the while (defined (my $line =<DATA>)){} syntax ... a line with just "0" could evaluate to "false".

I'm confused about what you intended to say in the quoted text. A
    while (<DATA>) { ... }
is always implicitly
    while (defined($_ = <DATA>)) { ... }
or more fundamentally
    while (defined($_ = readline(DATA))) { ... }
for  DATA or any other filehandle. Even if a  '0' with no newline is the last character in a file or  __DATA__ or  __END__ block, no warning will be printed. (IIRC, this became true in a very early, but still non-zero, sub-version of Perl 5 — or was it true even for 5.0.0?) (Update: The following code was tested under ActiveState Perl version 5.8.9.)

File t_read_DATA_1.pl:
# t_read_DATA_1.pl 12oct18waw use warnings; use strict; while (<DATA>) { print; } __DATA__ line the first second line penultimate line is line 3 0
Output:
c:\@Work\Perl\monks\Marshall>od -t x1 t_read_DATA_1.pl | tail 0000120 72 6e 69 6e 67 73 3b 0d 0a 75 73 65 20 73 74 72 0000140 69 63 74 3b 0d 0a 0d 0a 77 68 69 6c 65 20 28 3c 0000160 44 41 54 41 3e 29 20 7b 0d 0a 20 20 20 20 70 72 0000200 69 6e 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 5f 0000220 5f 44 41 54 41 5f 5f 0d 0a 6c 69 6e 65 20 74 68 0000240 65 20 66 69 72 73 74 0d 0a 73 65 63 6f 6e 64 20 0000260 6c 69 6e 65 0d 0a 70 65 6e 75 6c 74 69 6d 61 74 0000300 65 20 6c 69 6e 65 20 69 73 20 6c 69 6e 65 20 33 0000320 0d 0a 30 0000323 c:\@Work\Perl\monks\Marshall>perl t_read_DATA_1.pl line the first second line penultimate line is line 3 0

Another way to see this is by deparsing:

c:\@Work\Perl\monks\Marshall>perl -MO=Deparse,-p t_read_DATA_1.pl use warnings; use strict 'refs'; while (defined(($_ = <DATA>))) { print($_); } __DATA__ line the first second line penultimate line is line 3 t_read_DATA_1.pl syntax OK 0
See O and B::Deparse. (I think the final  "0" appears in console output before the  "syntax OK" message because the  "0" is not terminated by a newline and doesn't get flushed until the process ends. The  "syntax" message may also be going to STDERR. Or something like that...)

Update: I really should have mentioned that the preceding code was run under ActiveState Perl version 5.8.9, the ancientest Perl I hold in captivity.


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^5: how do I "initialize" $_
by Marshall (Canon) on Oct 13, 2018 at 04:21 UTC
    I tested this with my Perl
    C:\Users\mmtho\Documents\PerlProjects>perl -v This is perl 5, version 24, subversion 3 (v5.24.3) built for MSWin32-x +64-multi-thread (with 1 registered patch, see perl -V for more detail) ...
    And I found out that Perl has changed how it deals with <DATA>.
    This works with Perl 5.24:
    #!/usr/bin/perl use strict; use warnings; while (my $line = <DATA>) { print $line; } __DATA__ aBC XYAS

      In an oversight since corrected, I neglected to mention that the code here was run under Perl version 5.8.9.

      I tried

      while (my $line = <DATA>) { print $line; }
      with my original  __DATA__ both with and without a newline after the 0 on the final line and with strictures and warnings fully enabled and under 5.8.9 and saw no difference in behavior (and no warnings). The reason is easy to see from a deparse:
      c:\@Work\Perl\monks\Marshall>perl -MO=Deparse,-p t_read_DATA_2.pl use warnings; use strict 'refs'; print("perl version: $] \n\n"); while (defined((my $line = <DATA>))) { do { print($line) }; } __DATA__ line the first second line penultimate line is line 3 t_read_DATA_2.pl syntax OK 0
      The defined test is automatically added.


      Give a man a fish:  <%-{-{-{-<

        Interesting.

        In any event apparently defined() on the <DATA> file handle is not needed - or at least not any more.

        Update: I haven't been able to reproduce this warning on my current Perl 5.24 version. From what I remember the warning was unusually specific in what it said - this was very specific. To my knowledge, I never did actually try Perl code that would cause the problem that was warned about. This was a warning about something that could potentially happen - not an error. This situation did not occur in my source code. I just took Perl at "its word" and adjusted my source code so that this warning went away.

        I think of Perl as a living, breathing, biological organism that evolves over time. It is completely possible that this was an extraneous warning about something that didn't really matter. At this point, I don't know. It could be that this warning was just emitted in one version of Perl and corrected in the next version. I've worked with a lot of versions of Perl. I don't have nor would I have saved the exact text of this warning.