http://qs321.pair.com?node_id=643966


in reply to How to swap rows with columns?

I wondered how to do this if the rows were not all the same length. This is what I came up with.

use strict; use warnings; use Data::Dumper; use List::Util q{max}; my @arr = ( [ qw{ ein zwei drei } ], [ qw{ one two three four five } ], [ qw{ un deux trois quatre } ], [ qw{ uno due tre quattro cinque sei} ], ); print Data::Dumper->Dumpxs([\@arr], [q{*arr}]); my @transposed = map { my $col = $_; [ map { exists $arr[$_]->[$col] ? $arr[$_]->[$col] : undef } 0 .. $#arr ] } 0 .. max(map { $#{ $_ } } @arr); print Data::Dumper->Dumpxs([\@transposed], [q{*transposed}]);

Here's the output.

@arr = ( [ 'ein', 'zwei', 'drei' ], [ 'one', 'two', 'three', 'four', 'five' ], [ 'un', 'deux', 'trois', 'quatre' ], [ 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei' ] ); @transposed = ( [ 'ein', 'one', 'un', 'uno' ], [ 'zwei', 'two', 'deux', 'due' ], [ 'drei', 'three', 'trois', 'tre' ], [ undef, 'four', 'quatre', 'quattro' ], [ undef, 'five', undef, 'cinque' ], [ undef, undef, undef, 'sei' ] );

I imagine some of the modules mentioned could cope with this but haven't checked.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: How to swap rows with columns?
by BrowserUk (Patriarch) on Oct 10, 2007 at 16:00 UTC

    Nice variation of the problem.

    @arr = ( [ qw{ ein zwei drei } ], [ qw{ one two three four five } ], [ qw{ un deux trois quatre } ], [ qw{ uno due tre quattro cinque sei} ], );; push @xformed, [ map{ shift @$_ } @arr ] while @{ $arr[-1 ] };; print pp @xformed;; ( ["ein", "one", "un", "uno"], ["zwei", "two", "deux", "due"], ["drei", "three", "trois", "tre"], [undef, "four", "quatre", "quattro"], [undef, "five", undef, "cinque"], [undef, undef, undef, "sei"], )

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Now that's very neat! BrowserUk++

      Cheers,

      JohnGG

        Not so neat after all. It relies on the fact that your data had the biggest sub-array last. Move it to any other position and it fails. You still need max() for a proper solution.


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.