Jan Eden wrote:
>
> a while ago, I wrote a little subroutine to test wether a given element is in a
> given array:
>
> sub contains {
>
>     my $result = 0;
>     my $contained = shift;
>     foreach (@_) {
>         if ($_ eq $contained){ $result = 1; }
>     }
>     $result;
> }
>
> Now I found a nicer solution in "Learning Perl Objects, References & Modules"
> and adapted it:
>
> sub contains {
>     my $contained = shift;
>     my $result = grep { $contained eq $_ } @_;
> }
>
> Smart. But immediately after giving this example, Randal notes that this is not
> the best solution for testing large arrays. Can anyone give me a hint to what he
> might have meant? Or, to put it this way: Randal, what did you think of writing
> this?

Hi Jan.

If you want to test a static (unchanging) array for the containment of many different
values you should build a hash out of the array elements:

  my @data = 'a' .. 'm';
  my %data_hash;
  @[EMAIL PROTECTED] = ();

Then simply check for the existence of a hash element with the required value as
a key:


  for (split '', 'robdixon') {
    if (exists $data_hash{$_}) {
      printf "Element %s found in [EMAIL PROTECTED]", $_;
    }
    else {
      printf "Element %s isn't in [EMAIL PROTECTED]", $_;
    }
  }

**OUTPUT

  Element r isn't in @data
  Element o isn't in @data
  Element b found in @data
  Element d found in @data
  Element i found in @data
  Element x isn't in @data
  Element o isn't in @data
  Element n isn't in @data

But this isn't practical if the hash keeps needing to be rebuilt because the array
hash changed. Depending on your data it may be a good idea to start with a hash anyway,
but for a general overview of the topic look at:

  perldoc -q "array contains"

HTH,

Rob



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to