Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??
I've just spent more than one hour debugging very wierd problem. Test script for one of my projects I'm currently working on died with error like:
Modification of a read-only value attempted at /usr/share/perl5/Net/DN +S/Resolver.pm line 235. Compilation failed in require at /usr/share/perl5/Net/DNS.pm line 23. BEGIN failed--compilation aborted at /usr/share/perl5/Net/DNS.pm line +23. Compilation failed in require at /usr/share/perl5/Mail/CheckUser.pm li +ne 28. BEGIN failed--compilation aborted at /usr/share/perl5/Mail/CheckUser.p +m line 30. .... ....
Let's look in Net/DNS/Resolver.pm:
.... sub res_init { if ($os eq "unix") { res_init_unix(); } .... } .... sub res_init_unix { read_config($resolv_conf) if (-f $resolv_conf) and (-r $resolv +_conf); .... } .... sub read_config { .... while (<FILE>) { <------ This is line 235 where it fails .... } .... res_init()
As you can see on load of Net::DNS::Resolver module it tries to read DNS resolver configuration file in subroutine read_config() if it runs on Unix and there exist this file. Nothing wrong with it at first look. Yet it fails with 'Modification of a read-only value attempted' error on while (<FILE>) { line.

Turned out that I had some code which could load Net::DNS module on demand and this code was called inside of map. My next step was finding that following snipplet dies with same error. map { require Net::DNS } 1;
Than I removed all non-essential details and I got final test case: map { while(<>) { } } 1;
Suddendly this error started to make sense to me. map associates $_ to elements of the passed list. In this case it is a list with a single element - constant 1. As it is a constant $_ becomes read-only but while(<>) { } still tries to assign data obtained from file handle to $_ and it results in this error.

So what is the conclusion? Do not use while(<>) { } unless you localize $_ or you are completly sure that nobody will call you code from map (or grep, or for/foreach - they are subject to the same problem). Personally I prefer always using while(my $line = <>) construct.

Update: These nodes demonstrate same problem with while(<>) { ... }: Method call to tied hash leads to file read error and opening a file destroys nulling entries in a list?!?!.

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


In reply to while(<>) { ... } considered harmful by IlyaM

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    [Corion]: ambrus: AnyEvent(::HTTP) doesn't integrate well with Prima, that's my main problem
    [Corion]: There is a weirdo shim because there is a POE integration for Prima, and if you use that, you can use the POE adapter of AnyEvent. What I'd want is something transport agnostic that parses HTTP or produces HTTP output, so that the communication with ...
    [Corion]: ... the socket is done by my code. Ideally that module would not be based on callbacks ;)

    How do I use this? | Other CB clients
    Other Users?
    Others chilling in the Monastery: (11)
    As of 2016-12-07 15:45 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?
      On a regular basis, I'm most likely to spy upon:













      Results (130 votes). Check out past polls.