in reply to extra spaces between the characters in string

Believe it or not, even in a problem that looks like it could have a solution using substr(), regular expressions are usually a superior solution.   So much time has been poured into that code, both in terms of ability and of overall efficiency, that it wins race after race after race.   (I know, it’s counter-intuitive.   It had to be proven to me, too.)

Replies are listed 'Best First'.
Re^2: extra spaces between the characters in string
by BrowserUk (Patriarch) on Jun 08, 2011 at 13:05 UTC
    Believe it or not,

    Not. Show us one example where a regex comes even close to matching much less beating substr?

    $s = '1234567890'x10;; cmpthese -1, { a=>q[ my $x = substr $s, $_, 10 for 0 .. 99], b=>q[ my($x) = m[^.{$_}(.{10})] for 0 .. 99] };; Rate b a b 1113/s -- -97% a 42708/s 3738% --

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      Problems that *could* be done with substr, but are not trivial as in your example. Also, "superior" ne "purely faster".

      If it requires loops and ifs around the substr, it is surely faster to write and debug. Execution would depend on how much and how fancy you need to be. The OP problem, for example, is nearly trivial with a regex, but you'd have to pay me money to write as a set of substr()s.

      "Usually" is certainly debatable, and I expect that it strongly depends on your environment. Personally, my code has a ratio of maybe 1:99 substr:regex. Filtering to what could plausibly be done with a set of substr, I'd guess it could be brought up to about 50/50, but the code would be horrendously brittle and scary. And I'm pretty sure my implementation of the search and matching would not be as fast as the regex engine.

      If you are always dealing with fixed width field data, substr becomes more useful and common.