Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: Fun with two-dimensional arrays

by bikeNomad (Priest)
on Aug 09, 2001 at 21:04 UTC ( #103504=note: print w/replies, xml ) Need Help??

in reply to Fun with two-dimensional arrays

I don't know why you say the number of rows is hard coded. Why can't you just do this:

foreach my $row (0 .. $lastRow) { }

But you might consider not storing it as a 2-dimensional array, but rather as a 22x80 character-long string. Then traversal becomes simply a matter of using substr and multiplying indexes (and it duplicates the behavior of wrapping that most terminals exhibit):

my $screen = ' ' x ($rows * $columns); foreach my $row (0 .. $rows-1) { my $rowText = substr($screen, $row*$columns, $columns); } # sets text, returns old text. sub setTextAt { my $x = shift; my $y = shift; my $text = join('', @_); substr($screen, $y * $columns + $x, length($text), $text); }

Replies are listed 'Best First'.
Re(2): Fun with two-dimensional arrays
by FoxtrotUniform (Prior) on Aug 09, 2001 at 21:14 UTC

    I guess I obscured my question with too much detail about the problem. I'm asking mostly to satisfy my curiosity.

    Without all the

    baggage, my question is: given an array of arrays (of arbitrary dimensions), how do you hit every element, first visiting the first element in each array, then the second, and so on?

    For instance, if you had:

    my $array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
    you'd want to visit in the order 1, 4, 7, 2, 5, 8, 3, 6, 9.

    Did that make sense?

    update: why @ (in scalar context) and $# didn't occur to me when I posted this, I don't know. That said, mapcar is damn cool.
      Why not cycle through the top-level array, shifting off the bottom element in each sub-array? Something like
      @array = ([1,2,3],[4,5,6],[7,8,9]); while (grep scalar @{ $_ }, @array) { for $i (@array) { print shift @{ $i }; } }
      This has the merit that not only do you not need to code (or even initialise, or know) the number and length of sub-arrays, but they can also be of different lengths.

      George Sherston
      Assuming you have fixed-size subarrays, you can do this:

      my $columns = 3; foreach my $x (0 .. $columns - 1) { foreach my $y (0 .. $#array) { print $array->[$y]->[$x] } }
      update: went back and re-read question.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://103504]
[ambrus]: Corion: some of these stupid syntax highlighters assume that too. just look at the table in http://perldoc. functions/pack. html for example.
[haukex]: ..."yet" ;-) I haven't had to deal with Dist::Zilla yet but I've heard about how it's a big setup
[ambrus]: I really don't like automagic stuff. I'm happy when computers do exactly what I tell them, even if that means they sometimes do the wrong thing.
[ambrus]: And I don't much like syntax highlighters. If you need a syntax highlighter to understand your code, then your code is written unclear.
[ambrus]: And if you need a syntax highlighter to color parenthesis green and numbers black and letters blue, then you're using the wrong font.
[ambrus]: I have to tolerate syntax highlighters when other people use them, but I don't use them myself. And sorry for the rant.

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (14)
As of 2017-02-27 12:45 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (385 votes). Check out past polls.