Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

What would be the most efficient way to write the following code in Perl:

       my $index = 0;
       foreach ( @spec ) {
          if ( $module =~ m/$_/ ) {
         splice(@spec, $index, 0, $module);
             last;         
          }
          $index++;
       }

This works fine. Just seems a little wordy. The idea is that where I find a match for $module in the array I add an entry. I want to keep the array in a certain order and sorted.

share|improve this question
add comment

2 Answers

You want "more efficient wordiness"??? I presume you're not asking for golfing, but for code that's more readable from conciseness.

@spec = map { $_ eq $module ? ($_, $_) : $_ } @spec;
share|improve this answer
    
Yeah this is perfect! –  evolution May 10 '13 at 15:25
add comment
  1. You manually increment the $index. Just loop over the indices instead:

    for my $index (0 .. $#spec) {
      if ($module =~ /$spec[$index]/) {
        splice @spec, $index, 0, $module;
        last;
      }
    }
    

    On newer perls (v12+) you can use each on arrays:

    use 5.012;
    while(my ($i, $str) = each @spec) {
       if ($module =~ /$str/) {
         splice @spec, $i, 0, $module;
         keys @spec; # reset the `each` iterator
         last;
       }
    }
    
  2. If the values in @spec are not regexes, but just plain strings, and iff you want to test that $module contains the string in $spec[$index], then you could use index for better efficiency.

    if (-1 != index $module, $spec[$index]) { ... }
    

    This also won't treat characters like \[]()?+* as metacharacters any more. This would be similar to /\Q$spec[$index]\E/ (see quotemeta function), but more efficient

    If you actually want to apply the string as a regex, this point is moot.

share|improve this answer
    
Ad. #1: I'd use foreach loop and increment counter manyally just like OP, so it's rather subjective (although each would be my choice if all production code run on >= v5.12). –  Xaerxess May 10 '13 at 14:36
    
It would probably be safer to reset the iterator before you modify the array. –  ikegami May 13 '13 at 1:12
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.