Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

What's the best way to check whether a certain element is in an array? If it's not already in the array I want to add it (i suppose using push). I'm thinking I can loop thru the array and set a variable if I find what I'm looking for, but is there a better way?
Thanks

Replies are listed 'Best First'.
RE: newbie alert: find in array
by vroom (His Eminence) on Jan 11, 2000 at 04:40 UTC
    Depending on what you're doing you may want to use a hash instead. If the main thing you're concerned with is whether your collection already contains something you should use a hash instead. Instead of searching the entire array for each an item which takes O(n) time a lookup in a hash takes O(1). This means that if your array size doubles your search time on average will double as well. A hash has a constant lookup time will remain the same whether the hash contains 1 or a million items. For an example we'll read a line from the keyboard and if we've seen it already we'll add it to our "collection".
    my %set #how you initialize an array while($line=<>) #while text is coming in from the keyboard #set $line=line of keyboard input { unless($set{$line}){ $set{$line}=1; # basically means we've seen this line } } #now lets see each $line we've encountered foreach my $line(keys %set){ print $line; }
    Hope this helps you might also want to look at The Basic Datatypes, three for more info on hashes. There is also a similar question in the faq about How can I tell whether a list or array contains a certain element?
Re: newbie alert: find in array
by Kasei (Novice) on Jan 11, 2000 at 06:27 UTC
    To add $c to @a only if $c does not appear in @a: push(@a,$c) unless (grep { $_ eq $c } @a); A hash might be better as this is somewhat costly on an array...
RE: newbie alert: find in array
by Anonymous Monk on Jan 13, 2000 at 11:20 UTC
    I would be inclined to use a associative array for this, since it allows you to easily track the number of ocurrences. eg. foreach $possibly_new_element (@all_elements) { $element_count{$possibly_new_element}++; } then to display what you've found foreach(keys %element_count) { print"$_ ocurred $element_count{$_} time(s)\n"; }