8 ms·
As someone who makes much of his living rehabilitating old perl scripts, please, if you must use such things, use them like this: [ -~] #match only printable c
by noonespecial 14y ago
As someone who makes much of his living rehabilitating old perl scripts, please, if you must use such things, use them like this:
[ -~] #match only printable characters
It takes 5 seconds longer and with regexes, just knowing what the damn thing is trying to do is half the battle. When you use a regex, use a comment. Its the civil thing to do.
- sbochins 14y agoYea, anytime I use a regex that isn't immediately obvious I put it in a function called get_<something>. Unfortunately people that write overly complicated and error prone regexes usually don't choose to document them.
- laumars 14y agoIf a regex is going to be reusable, then yeah, I'd agree. But dumping single lines of code into their own functions just for readability isn't practical for real time systems. In those cases you really should be using comments as they get stripped out by the compiler.
- entropy_ 14y agoCouldn't those functions just be inlined by the compiler if they're simple regex-wrappers anyway? I do agree that it might be overkill to move regexes to their own functions just for readability's sake but I don't buy the performance argument. Furthermore, regexes are most popular in scripting languages that no sane person would use for real time performance-critical systems anyway.
- laumars 14y ago1. Ahh right. I wasn't aware that happened. 2. Web sites are a classic example of scripting languages being used for real time performance critical systems (though I'm not arguing that all web sites are real time). Sometimes the ability to modify code easily is as important to the choice of languages as the raw execution speed of the compiled binaries.
- deleted 14y ago[deleted]
- hellrich 14y agoShouldn't most compilers (jit-)inline it?
- jbooth 14y agoREGEXES aren't practical for real time systems. If you're using a regex, and certainly if you're using a language other than C, you probably have space for the function call overhead.
- laumars 14y agoI don't really agree with that. Sometimes C is inappropriate (eg you'd be nuts to build a website in C yet some sites do offer real time services) Often the data set and/or logic required makes C an inappropriate language (eg you wouldn't use C for AI nor for some types of database operations). And even in the cases where you're just building a standard procedural system, sometimes the interface lends itself better to other languages (eg C would be possibly the worst language for real time websites.) But even in the cases where you're building a solution that's suited for C, there are still other performance languages which could be used. "Real time" is quite a general term and as such, sometimes it makes more sense to use scripting languages which are performance tuned. Which is where writing 'good' PCRE is critical as RegEx can be optimised and compiled - if you understand the quirks of the language well enough to avoid easy pitfalls, eg s/^\s//; s/\s$//; outperforms s/(^\s|\s$)//; despite it being two separate queries as opposed to one.
- jbooth 14y ago"Real time" is commonly assumed to mean that you can't use a garbage collected language or need to be extremely careful doing so because random pauses of 100ms break your constraints. If you're in a situation where the overhead of a couple of function calls is unacceptable, regexes are totally unacceptable and you need to write custom character manipulation. This situation is really rare and in almost all business cases, using C is inappropriate.
- tomjen3 14y agoUnless you want to seem clever and impresse the PHB. It is the selfish (but smart) thing to do.
- nathan_long 14y agoI'm not sure who the PHB is, but I'm certainly not impressed by anything cryptic in a codebase. Deliberately writing code that's hard to understand should be a firing offense.
- rada 14y agoPHB: Pointy Haired Boss
- nathan_long 14y agoIn that case, the smart thing to do is not to work for the PHB, rather than pervert your craft in an attempt to impress him/her.
- yxhuvud 14y agoor even better # Match only printable ASCII characters.
- noonespecial 14y agoThe writer of said script needing rehabilitation probably doesn't have that much insight. Just try to tell me what you were trying to get done and that will be enough. The worst case is when the original author never really had it clear in his/her mind what exactly that compound regex was trying to accomplish. They just kind of bodged and hacked till the usual input stream started coming out right. Trying to write a clear comment on the purpose of the regex helps with that too.
- CountHackulus 14y agoThank you for that. You have no idea how annoying it is to port perl scripts from ASCII to EBCDIC when they do that kind of thing.
- rmc 14y agoIt's not an ASCII v EBCDIC thing, its an ASCII vs Unicode thing.
- dredmorbius 14y agoMore generally, it's a characterset / collate sequence thing. Specifying a range with a start and end point requires understanding what that range specifies. Which can change depending on context, locale, characterset, etc.
- tripzilch 14y agoAlso in the 32-127 ASCII range? I thought they just differ in 128-255 with the code pages and such?
- dredmorbius 14y ago
- hnriot 14y agoGoogle is by far the best "comment"
- missing_cipher 14y agoSearch "[ -~]" (with or without quotes) to see how good Google's comment is.
- logn 14y agoThe only ambiguous thing about this regex is knowing what's between space and tilde. Otherwise this is a pretty ordinary regex.
- wpietri 14y agoThe only thing ambiguous about it is most of it?
- masterzora 14y agoNot that I agree with the "expect people reading your code to Google things" mindset, but to be fair the only ambiguous thing is the ASCII table which is Googleable.
- darklajid 14y agoHey, might just be me. I'm usually the 'Ben, can you help me with a regular expression' guy over here, but I stumbled, hard, and failed to connect the '-' with a range of characters (probably because I never thought of 'space to .. something'). So I read the snippet, thought 'Yeah, a character class of space, -, ~' and fell on my face in the next couple of lines. Yeah, I should've known better, I know how to read it. If .. I invest the time and don't glance over a construct and hope to just get it instantly. I wouldn't want to see this in a code base without proper documentation (be it a comment, a function name or whatever. Something).
- citricsquid 14y agoAre you saying people should google regular expressions? in my experience (correct me if I'm wrong) that doesn't work, I've never been able to get google to return relevant results even with quotation marks.
- atsaloli 14y agoI recommend using the /x suffix to extend your pattern's legibility by permitting whitespace and comments. /x allows you to break up your regex into its component parts, one part per line, and then comment each part. Here is what the manual says about /x: /x tells the regular expression parser to ignore most whitespace that is neither backslashed nor within a character class. You can use this to break up your regular expression into (slightly) more readable parts. The # character is also treated as a metacharacter introducing a comment, just as in ordinary Perl code. This also means that if you want real whitespace or # characters in the pattern (outside a character class, where they are unaffected by /x), then you'll either have to escape them (using backslashes or \Q...\E ) or encode them using octal, hex, or \N{} escapes. Taken together, these features go a long way towards making Perl's regular expressions more readable. http://perldoc.perl.org/perlre.html http://perldoc.perl.org/perlre.html
- Shorel 14y agoIn this case, the entire post was the comment. You are right anyway.
- deleted 14y ago[deleted]
- perlgeek 14y agoOr just use [[:print:]]