in reply to Re^2: array in different columns
in thread array in different columns

Maybe you want to think of it in a different way, by looking at how to divide the array across columns. If you build your columns and then print every row of your column, you should get your result. I'm going to first show you how to do it for a fixed number of columns and then how to expand that to an arbitrary number of columns:

my @column1; my @column2; my @column3; my @column4; while( @array and $array[0] ne '--') { push @column1, shift @array; }; shift @array; while( @array and $array[0] ne '--') { push @column2, shift @array; }; shift @array; while( @array and $array[0] ne '--') { push @column3, shift @array; }; shift @array; while( @array and $array[0] ne '--') { push @column4, shift @array; }; shift @array; for my $row (1..3) { print join "\t", $column1[$row], $column2[$row],$column3[$row],$co +lumn4[$row]; print "\n"; };

Now, that only works for four columns. To make it work with any number of columns, we need to move away from the named column arrays and store all column arrays in another array ("AoA"):

my @column; my $curr_column = 0; my $rows = 0; while( @array and ) { if( $array[0] ne '--' ) { $column[ $curr_column ] ||= []; # a new column push @{ $column[ $curr_column ] }, shift @array; if( $rows < $#{ $column[ $curr_column ] } ) { $rows = $#{ $column[ $curr_column ] }; }; } else { $index++; shift @array; }; }; for my $row (0..$rows) { print join "\t", map { $_->[ $row ] } @column; print "\n"; };

Replies are listed 'Best First'.
Re^4: array in different columns
by Muflone82 (Novice) on Nov 23, 2016 at 11:08 UTC
    Thank you but the script doesn't work...I obtaine:
    syntax error at /home/.../scripts/creaNexusMatrix.pl line 87, near "an +d ) " syntax error at /home/.../scripts/creaNexusMatrix.pl line 94, near "}" Global symbol "$index" requires explicit package name at /home/.../scr +ipts/creaNexusMatrix.pl line 95. syntax error at /home/.../scripts/creaNexusMatrix.pl line 97, near "}" Execution of /home/.../scripts/creaNexusMatrix.pl aborted due to compi +lation errors.

      The code I posted doesn't even have 87 lines, so I'm not really sure what you expect me to do here.

      Looking over the code I actually posted, there is a trivial syntax error on line 5. There is a stray and there. Removing this makes my code compile without error.

      Maybe you can apply a similar technique to your code.

        I delated "and" and I obtained
        Global symbol "$index" requires explicit package name at /home/../scri +pts/creaNexusMatrix.pl line 12. Execution of /home/../scripts/creaNexusMatrix.pl aborted due to compil +ation errors.
        so I added
        my $index;
        and the code began;
        my @column; my $index; my $curr_column = 0; my $rows = 0; while( @array) { if( $array[0] ne '--' ) { $column[ $curr_column ] ||= []; # a new column push @{ $column[ $curr_column ] }, shift @array; if( $rows < $#{ $column[ $curr_column ] } ) { $rows = $#{ $column[ $curr_column ] }; }; } else { $index++; shift @array; }; }; for my $row (0..$rows) { print join "\t", map { $_->[ $row ] } @column; print "\n"; };
        Now the script works but I didn't obtain that I hope... I obtained:
        -- 0.0175 0.0483 0.0507 -- 0.0471 0.0483 -- 0.0287 --