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


in reply to while(<>) { ... } considered harmful

map { require Net::DNS } 1;

Is that a map in void context? Nasty and evil. (I don't recall require ever returning anything useful.)

Personally I prefer always using while(my $line = <>) construct.

I don't always. Setting $_ lets one use regexes and simple commands easier. I do use a lexical for more complicated blocks, but I often find myself just slurping the file into an array first.

- Yes, I reinvent wheels.
- Spam: Visit eurotraQ.

Replies are listed 'Best First'.
Re(2): while(<>) { ... } considered harmful
by FoxtrotUniform (Prior) on Sep 08, 2002 at 01:24 UTC
        map { require Net::DNS } 1;
      Is that a map in void context? Nasty and evil.

    I believe that's a minimal demonstration of a bug, rather than "real" code.

    On the subject of while(<>) vs. while(my $line = <>), I tend to prefer the former:

    • If I don't have to do much processing for each line, it's usually much nicer to work on $_, as Juerd points out.
    • If I do have a lot of work to do, it's usually in a subroutine call, where this sort of thing isn't an issue (since the scope has changed).

    I haven't really thought about it, but if a loop's so complex that you have to assign to an explicit iterator variable just to figure out what's going on (as opposed to a loop where defaulting to $_ would be inappropriate for other reasons), it's probably an indication that the loop needs simplifying.

    --
    F o x t r o t U n i f o r m
    Found a typo in this node? /msg me
    The hell with paco, vote for Erudil!

      I believe that's a minimal demonstration of a bug, rather than "real" code.

      You are right. Real code looks like:

      my @other_connectors = map $ad_obj->connector(field => $_), qw(header description region country state);
      No require on the surface. It was deeply hidden in one of method calls. I though it was just a Perl bug when I got that error for first time.

      --
      Ilya Martynov (http://martynov.org/)

Re: Re: while(<>) { ... } considered harmful
by schwern (Scribe) on Aug 07, 2003 at 21:40 UTC
    require returns the last evaluated expression in the file. Normally this is 1, but I've seen people do wacky things like have "return %hash" as the last expression and do "%hash = require Foo::Bar";
      require returns the last evaluated expression in the file

      Only the first time:

      > perl -de 0 ... DB<1> x require 'con' 'this is true'; ^Z 0 'this is true' DB<2> x require 'con' 0 1 DB<3> x require 'con' 0 1 DB<4>
      I've seen people do wacky things like have "return %hash" as the last expression and do "%hash = require Foo::Bar";

      So such code will break as soon as more than one use of the module is attempted from a single run. That's a bit of a shame too, since Perl could really use something along those lines.

                      - tye

      Since my post, I have used eval { require ... } ? ...->import : *symbol = sub { dummy here } a lot.

      Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }