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

You are mentioning that if this is added to the array:
[ 'ALICE WONDER', '9876543', '2009', '15.00', '711', '4', '5', '9' ],

another loop has to be added to the code? What if you dont know the number of elements in this array?

Replies are listed 'Best First'.
Re^3: Keeping Unique Elements in Array!
by almut (Canon) on May 01, 2009 at 18:46 UTC

    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++; } }
      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;
      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 ] ];