http://www.perlmonks.org?node_id=80644


in reply to Re: Re: Fastest way to compare multiple variables?
in thread Fastest way to compare multiple variables?

Wow, the light at perlmonks.com seems to be ON all day/night! Someone is always here... cool!

All Those arrays are actually from a CGI page:

use CGI;
@array1 = param('datalist1');
@array2 = param('datalist2');
@array3 = param('datalist3');

I think Masem's idea works well already. Or any suggestions/comments for learning purpose?
  • Comment on Re: Re: Re: Fastest way to compare multiple variables?

Replies are listed 'Best First'.
Re: Re: Re: Re: Fastest way to compare multiple variables?
by merlyn (Sage) on May 15, 2001 at 21:51 UTC
    use CGI; @array1 = param('datalist1'); @array2 = param('datalist2'); @array3 = param('datalist3');
    If you could make that instead:
    my %data = map { $_ => [param $_] } qw(datalist1 datalist2 datalist3);
    Then we can compare their lengths with:
    sub compare { my @lengths = map { scalar @{$data{$_}} } qw(datalist1 datalist2 dat +alist3); my $first = shift @lengths; $first == $_ or return 0 for @lengths; return 1; }
    See how much easier? Regularity in variable names is almost always a sign that they should be part of a larger structure instead.

    -- Randal L. Schwartz, Perl hacker

      Okay, I cannot resist. This is the product of not enough sleep and I warn all who continue. Given we have used merlyn's suggestion for a hash of arrays ( I was actually thinking of an array of ararys, but why not a hash? ), what if we did something like this
      sub compare { my %data = @_; my @lengths = sort { $a <=> $b } map { scalar@{$data{$_}} } keys %da +ta; return $lengths[0] == $lengths[-1]; }
      Basically, if we sort the lengths and the last element is equal to the first element, then everything else inbetween must be equal.

      This has likely no value - it really isn't clearer nor does it likely save any cycles. I just thought it was fun and have not had enough sleep.

      UPDATE: did I mention not enough sleep? Fixed a typo
      mikfire

      I see... thanks. Seem function map is pretty useful.

      I too couldn't resist. A single walk through the hash's keys is the fastest way I could think of doing this:

      sub dkubb_compare { my $data = shift; my $first = @{$data{scalar each %$data}}; while(my $key = scalar each %$data) { return 0 unless $first == @{$data{$key}}; } return 1; }

      IMHO, it's a little too obscure to be used in production code, but I think it still is a neat idiom.