in reply to Re^2: help with an array of arrays
in thread help with an array of arrays

better?

use strict; use warnings; use Data::Dump qw/pp dd/; use List::Util qw(min max); use constant { name=>0, num=>1 }; my @AoA = ( ["nick","99"], ["john","88"], ["peter","77"], ["thomas","99"] ); my $max_num = max map { $_->[num] } @AoA; my @max_names = map { $_->[name] } grep { $_->[num] == $max_num } @AoA; pp @max_names;

and for completeness another variant

my @max_names = map { $_->[num] == $max_num ? $_->[name] : () } @AoA;

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Replies are listed 'Best First'.
Re^4: help with an array of arrays
by Anonymous Monk on Sep 16, 2018 at 21:39 UTC
    A question on this if I may:
    is it possible to do something similar to foreach for arrays, in array of arrays?. I mean, in the following code:
    my $min_diff_past = max (@all_date_diffs_past); for my $j ( 0 .. $#AoA_past ) { if ($AoA_past[$j][1]==$min_diff_past) { print $AoA_past[$j][0]."\t"; } }

    is there a way to not write the for loop but substitute it with a foreach loop or not?
      You want to replace c style for with list for?

      Try this

      my $min_diff_past = max (@all_date_diffs_past); for my $arr ( @AoA_past ) { if ($arr->[1]==$min_diff_past) { print $arr->[0]."\t"; } }
      (untested, you seem to confuse min and max)

      NB: The foreach keyword is actually a synonym for the for keyword, so you can use either.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      is there a way to not write the for loop but substitute it with a foreach loop or not?

      I don't really understand the question, but an answer to a literal interpretation of it is that in Perl, for-loops and foreach-loops are synonymous in (almost!) every case:

      c:\@Work\Perl\monks>perl -wMstrict -le "foreach (my $i = 2; $i < 10; $i += 3) { printf qq{$i }; } print '' +; for (my $i = 2; $i < 10; $i += 3) { printf qq{$i }; } print '' +; ;; foreach my $i (2 .. 5) { printf qq{$i }; } print ''; for my $i (2 .. 5) { printf qq{$i }; } print ''; ;; printf qq{$_ } foreach 6 .. 9; print ''; printf qq{$_ } for 6 .. 9; print ''; " 2 5 8 2 5 8 2 3 4 5 2 3 4 5 6 7 8 9 6 7 8 9
      The only case in which an initialize/test/finalize (or C-style) for/foreach loop cannot be used is the statement modifier form: something like
          printf qq{$i } for (my $i = 2;  $i < 10;  $i += 3);
      will not fly.


      Give a man a fish:  <%-{-{-{-<