Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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);

This works fine but 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

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
  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;

    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
  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

Your Answer


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.