in reply to [Solved] Printing a 2D array into constant-sized columns

Hi, just giving an example using printf:
use strict; use warnings; my @accounts = [ [ current => 1000 ], [ savings => 2000 ], [ other => 500 ], ]; foreach my $sub_ref (@accounts) { printf "%-10s | %10d\n", $_->[0], $_->[1] for @$sub_ref; }
Output:
current | 1000 savings | 2000 other | 500
Update: Seeing hazylife's EDIT in the code section, it came to my mind that my above code could also be simplified to:
foreach my $sub_ref (@accounts) { printf "%-10s | %10d\n", @$_ for @$sub_ref; }
Please also note that my code might look slightly more complex (nested loops) because it is working on the OP's original AoA structure, whereas other solutions presented so far were just working on simple arrays.

Replies are listed 'Best First'.
Re^2: [Solved] Printing a 2D array into constant-sized columns
by mascip (Pilgrim) on Apr 02, 2014 at 11:00 UTC

    Thank you :-) This seems to be enough is my case:

    printf "%-10s | %10d\n", @$_ for @rows;
    Unless if I missed something in your message (what is AoA?)

    I found this post as a printf tutorial, will read it this week: Using (s)printf().

    What I like about Text::Column is that the code is simple, clear, and anyone can understand it. But I've waited too long before learning printf, it's about time! Your post gave me the energy to get started, thanks a lot.

      An AoA is an array of arrays. But in fact your structure is more complicated, it is an array containing a reference to an array of arrays (so it is really an AoAoA). I can't be sure of what you intended to do, but I would guess that you really wanted this:
      my @accounts = ( [ current => 1000 ], [ savings => 2000 ], [ other => 500 ], );
      instead of this:
      my @accounts = [ [ current => 1000 ], [ savings => 2000 ], [ other => 500 ], ];
      The difference, if you don't see it, is in the round surrounding parens, versus square surrounding brackets. The first one (an AoA) looks like this:
      0 ARRAY(0x80359d38) 0 ARRAY(0x80355ce8) 0 'current' 1 1000 1 ARRAY(0x80359d50) 0 'savings' 1 2000 2 ARRAY(0x803fe470) 0 'other' 1 500
      and the second one is clearly more complicated, as it has one more level of nesting:
      0 ARRAY(0x80359d38) 0 ARRAY(0x80356108) 0 ARRAY(0x80360410) 0 'current' 1 1000 1 ARRAY(0x80359c18) 0 'savings' 1 2000 2 ARRAY(0x80359bd0) 0 'other' 1 500
      Ah, and yes, by all means, learn to use sprintf and printf, they are really useful as soon as you need to format output.
        Oh, my mistake really, I meant
        @accounts = (
        Thanks a lot for your help, I've learned to use printf() thanks to you. It was much simpler than I thought it would be, and it is very flexible. Excellent!