in reply to Re^2: Keeping Unique Elements in Array!
in thread Keeping Unique Elements in Array!

What I meant is something like this, in which case you can have any number of arrays with any number of rows:

my $all_val = []; for my $aref (@$array_ref_x) { my $i = 0; for my $row (@$aref) { $all_val->[$i] = '' unless defined $all_val->[$i]; # for 'use + warnings' $all_val->[$i] = $row if $row gt $all_val->[$i]; $i++; } }

Replies are listed 'Best First'.
Re^4: Keeping Unique Elements in Array!
by Anonymous Monk on May 01, 2009 at 18:55 UTC
    That's a great answer, one more question since you mentioned numeric values and of course use > for numeric ones, is there a way in Perl to detect and do the evaluation on both cases, if it is numeric or not on the same array like the sample code above?

      There are several ways, for example Scalar::Util has looks_like_number(), or Regexp::Common's $RE{num}{real}.  Alternatively, in your specific case, you might just see if treating it as a number evaluates to zero, and then do a string comparison... (the latter wouldn't work if you also have negative numbers, though)

      Is this acceptable?
      my $all_val = []; for my $aref (@$array_ref_x) { my $i = 0; for my $row (@$aref) { $all_val->[$i] = '' unless defined $all_val->[$i]; # for use +strict # Check if numeric if ($all_val->[$i] =~ /^-?\d/){ $all_val->[$i] = $row if $row > $all_val->[$i]; }else{ $all_val->[$i] = $row if $row gt $all_val->[$i]; } $i++; } } print Dumper $all_val;
Re^4: Keeping Unique Elements in Array!
by Anonymous Monk on May 01, 2009 at 19:17 UTC
    It does not scale like I thought, I was think that it could analize it by lets say the first and second elements and do the rest, here is a sample of what I am sying:
    my $array_ref_x = [ [ 'ALICE WONDER', '9876543', '2009', '11.00', '711', '20', '0', '8', ], [ 'ALICE WONDER', '9876543', '2009', '11.00', '711', '3', '2', '0', ], [ 'ALICE WONDER', '9876543', '2009', '15.00', '711', '4', '5', '11', ], [ 'ALICE WONDER', '9876543', '2008', '15.00', '717', '4', '5', '9', ], [ 'John Day', '456789', '2011', '50.00', '717', '4', '22', '9', ], [ 'John Day', '456789', '2011', '50.00', '817', '4', '5', '90', ], [ 'Mary Ann', '123988', '2002', '10.00', '119', '5', '3', '0', ], ]; #Results my $array_ref_x = [ [ 'ALICE WONDER', 9876543, 2009, '15.00', 717, 20, 5, 11 ], [ 'John Day', '456789', '2011', '50.00', '817', '4', '22', '90', ], [ 'Mary Ann', '123988', '2002', '10.00', '119', '5', '3', '0', ], ];

      Ah, I see why you were thinking of uniqueness... Maybe something like this, combining the idea of max() and uniqueness via hash:

      ... # group arrays by person+id my %persons; for my $aref (@$array_ref_x) { my $uniq_key = "$aref->[0] $aref->[1]"; push @{$persons{$uniq_key}}, $aref; } my $all_val = []; for my $aref_person (values %persons) { push @$all_val, my $tmp = []; for my $aref (@$aref_person) { @$tmp[0..1] = @$aref[0..1]; for my $i (2..$#$aref) { $tmp->[$i] = 0 unless defined $tmp->[$i]; $tmp->[$i] = $aref->[$i] if $aref->[$i] > $tmp->[$i]; } } } print Dumper $all_val; __END__ $VAR1 = [ [ 'John Day', '456789', 2011, '50.00', 817, 4, 22, 90 ], [ 'ALICE WONDER', '9876543', 2009, '15.00', 717, 20, 5, 11 ], [ 'Mary Ann', '123988', 2002, '10.00', 119, 5, 3, 0 ] ];
        Yes, that's what I am trying to do, thanks, this is actually coming from a query result of two database tables, and before combining these two values I have to make sure the second array_ref will have the same number of elements than the first one. I am losing my mind on this one since I can't do a simple join on these tables. But this will clear some of my problems for sure! Thanks for showing me a clear way of doing this!