in reply to This runs WAY too slow

Before noticing your code is way too long, I spotted:
$value =~ s/%([\p{IsAlphabetic}\d][\p{IsAlphabetic}\d])/pack("C", hex($1)) +/egxsm;
Now, sidestepping the question why you're rolling your own parsing, why match anything alphabetic (more than 100,000 characters will match) or a digit (more than 400 matches). And considering that [\p{IsAlphabetic}\d] is equivalent to \p{Alnum}, you could have saved a lot of typing. Of course, it's still wrong. Much better would be the pattern: %(\p{AHex}{2}), as \p{AHex} matches exactly the 22 characters you want to match. Not a single character more, not a single character less. Much better than the 100,520 characters you're matching.

And what's up with the modifiers? You have 5, of which you're only using 2. You've no characters in your pattern that will change meaning with the /s, /m and /x modifiers.

Replies are listed 'Best First'.
Re^2: This runs WAY too slow
by Dandello (Monk) on Jan 17, 2011 at 14:59 UTC

    Because that's the recommendation in PBP and that's the line I use in all my forms and that's a line that will disappear once I get the output of 'use CGI' massaged into a form that actually gives good results into my dependent arrays - which is tomorrow's project.

    But 'Alnum' or 'AHex' sounds like a good idea for the short term.

      Please read the introduction of PBP again. If you follow recommendations from PBP just because PBP says so, you're doing it wrong.

        No, that's not the only reason. BTW 'IsDigit' gets it down to going through 10.