Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Commenting irrelevant code produces weirds errors

by Anarion (Hermit)
on Feb 17, 2002 at 03:07 UTC ( [id://145943]=perlquestion: print w/replies, xml ) Need Help??

Anarion has asked for the wisdom of the Perl Monks concerning the following question:

Well a weird thing that i dont understand:
I have this piece of code in the middle of a program:

my $num=0; for(@taulell) { $num+=grep /B/,@$_; } addstr(2,1,"B = $num"); addstr(24,3, "Y = $pos{y}"); $num=0; map { $num+=grep /B/,@$_; } @taulell; addstr(3,1,"N = $num"); addstr(24,35,"Tecla = <$key> ");

And it works well, but if i change it to:

my $num=0; #for(@taulell) #{ # $num+=grep /B/,@$_; #} addstr(2,1,"B = $num"); addstr(24,3, "Y = $pos{y}"); $num=0; map { $num+=grep /B/,@$_; } @taulell; addstr(3,1,"N = $num"); addstr(24,35,"Tecla = <$key> ");

I GET THE ERROR:

Modification of a read-only value attempted in the line inside the map

What's happening?

The entire code is HERE

Yes map in voice content is why i want to do something like:

addstr(3,1,"N = ". scalar map { grep { /B/ } @$_ } @taulell );

$anarion=\$anarion;

s==q^QBY_^=,$_^=$[x7,print

Replies are listed 'Best First'.
Re: Commenting irrelevant code produces weirds errors
by tachyon (Chancellor) on Feb 17, 2002 at 14:52 UTC

    Adding the necessary bits to make your sample run the error relates to how you generate @taulell and what then happens to it. Here is some sample code that reproduces the problem and also demonstrates what is happening.

    use Data::Dumper; # everything is fine using this @taulell array #@taulell = ( ['B1','B2','B3'], ['B4','B5','Y1'] ); # here is how you set @taulell sub inicialitzacions { $torn='B'; @{$taulell[3]}[3,4]=qw(B N); @{$taulell[4]}[3,4]=qw(N B); @pos{'x','y'}=(2,2); } inicialitzacions(); # @taulell looks like this print Dumper(\@taulell); my $num=0; for(@taulell) { $num+=grep /B/,@$_; } # @taulell now looks like this print Dumper(\@taulell); addstr(2,1,"B = $num"); addstr(24,3, "Y = $pos{y}"); $num=0; map { $num+=grep /B/,@$_; } @taulell; addstr(3,1,"N = $num"); addstr(24,35,"Tecla = <$key> "); # @taulell now looks like this print Dumper(\@taulell); sub addstr {}

    What you can see is that first loop modifies your data structure (into an array of arrays) which allows your map to run. When you kill the first loop you pass map your 'really weird' data structure and the map chokes

    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

      Thx tachyon, but where are or these
      ${\$VAR1->[3][0]}
      come from?

      If you see the entire program i just want to initialize those 4 scalars. May i have to initialize all the array to make it work with map?

      And another thing i dont understand too much is why for modify de array? Its a perl "feature" ? cough

      $anarion=\$anarion;

      s==q^QBY_^=,$_^=$[x7,print


        I have no idea why it generates that weird data structure!. It is not as though it is even consistent as the first value is undef (as you might expect) but then the other ones......are references to this undef value. Looks a bit like a {cough} feature to me. This may be a feature either of perl or Data::Dumper. As to why the grep then modifies this matrix just by looking at it -> GOK. Anyway I think this is probably the matrix you wanted in @taulell.

        sub inicialitzacions { $torn='B'; @taulell = ([],[],[],[('','','','B','N')],[('','','','N','B')]); @pos{'x','y'}=(2,2); }

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://145943]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2025-07-17 09:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.