http://qs1969.pair.com?node_id=1176868


in reply to split problem

I believe you have to initialize the array in order. Switching these two lines:

$flds[16] = undef; $flds[8] = 0;

...around like this:

$flds[8] = 0; $flds[16] = undef;

...will work, but then you won't be able to populate the other ones. Perhaps a full blown initialization of any array elements that aren't populated by split first?:

use warnings; use strict; use Data::Dumper; my $value = "A\tB\tC\tD\tE\tF\t\t\t\t"; my @flds = split(/\t/,$value); for (0..16){ $flds[$_] = undef if ! defined $flds[$_]; } $flds[8] = 0; print Dumper \@flds;

Output:

$VAR1 = [ 'A', 'B', 'C', 'D', 'E', 'F', undef, undef, 0, undef, undef, undef, undef, undef, undef, undef, undef ];

Replies are listed 'Best First'.
Re^2: split problem
by Anonymous Monk on Nov 29, 2016 at 23:20 UTC

    I believe you have to initialize the array in order. Switching these two lines:

    :) nope, this is perl, the order doesn't matter

    Looks like some recent optimization has backfired, again

      That's strange. Using OP's code on 5.24.0, it breaks. If I swap those two lines around, it works fine. I've never had an issue with assigning values to an array out of order before, but in this case, it definitely matters :)

      Works:

      use warnings; use strict; my $value = "A\tB\tC\tD\tE\tF\t\t\t\t\t\t"; my @flds = split(/\t/, $value); $flds[8] = 0; $flds[16] = undef; print scalar @flds; __END__ 17

      Borked:

      use warnings; use strict; my $value = "A\tB\tC\tD\tE\tF\t\t\t\t\t\t"; my @flds = split(/\t/, $value); $flds[16] = undef; $flds[8] = 0; print scalar @flds; __END__ Modification of a read-only value attempted at split.pl line 7.