Thanks for taking the time to put in explainations. Also a ruby newbie that never wrote anything useful yet, but started to follow this list a bit. Always look forward to your posting since I'm sure you'll put some line of code I won't understand.. ;-) Part of my learning is 'trying' to understand them. Thanks for the extra hand on this one! Dany On Tue, 17 Aug 2004 09:52:32 +0200 "Robert Klemme" <bob.news / gmx.net> wrote: > > "Daniel Vöěkerts" <dvoelkerts / web.de> schrieb im Newsbeitrag > news:cfr4ml$d13$00$1 / news.t-online.com... > > Robert Klemme wrote: > > > > > Some more admittedly ugly constructions: > > > > > > val = "<165> Aug 16 17:01:35 localhost Just a test" > > (1) This one converts the RX MatchData into an array and tests for emptyness > to determine whether it matched. And along the way values are assigned to > local vars. > > > > unless ( ( pri, timestamp, device, msg = * /^<(\d+)> \s+ (\S+ \s+ \d+ > \s+ > > > \d+:\d+:\d+) \s+ (\S+) \s+ (.*)$/x.match(val).to_a ).empty? ) > > > puts "matched" > > > end > > (2) Similar, but now just one local var is used as match check: if "pri" is > not nil, the RX matched. > > > > pri, timestamp, device, msg = * /^<(\d+)> \s+ (\S+ \s+ \d+ \s+ > \d+:\d+:\d+) > > > \s+ (\S+) \s+ (.*)$/x.match(val).to_a > > > if pri > > > puts "matched" > > > end > > (3) Same approach as (1) but the regexp is defined as a constant to make > stuff more readable. > > > > LOG_RX = /^<(\d+)> \s+ (\S+ \s+ \d+ \s+ \d+:\d+:\d+) \s+ (\S+) \s+ > (.*)$/x > > > > > > unless ( ( pri, timestamp, device, msg = * > LOG_RX.match(val).to_a ).empty? ) > > > puts "matched" > > > end > > (4) Similar approach to (2) but the test is included ("&& line"). Note that > this time no conversion to array is done here so we need the additional > local "line" to receive the complete capture. > > > > if ( line, pri, timestamp, device, msg = * /^<(\d+)> \s+ (\S+ \s+ \d+ > \s+ > > > \d+:\d+:\d+) \s+ (\S+) \s+ (.*)$/x.match(val) ) && line > > > puts "matched" > > > end > > (5) Same as (4) but with regexp in constant as in (3). > > > > if ( line, pri, timestamp, device, msg = * LOG_RX.match(val) ) && line > > > puts "matched" > > > end > > > > > > :-) > > > > > > robert > > > > > > > *boom* That blow my mind away! No no, thanks a lot for that piece of code. > > :-) I *should've* put some comments in... Ok, inserting them above now. > > > But I prefer the scanf and one-line-regexp. > > Basically I used extended regular expressions (switched by the "/x" flag). > Whitespace is ignored, that's why you see more "\s+" in there. And that's > why the regexp is longer. > > > I'll test which kind performs better for my needs. As I said, I'm a ruby > > newbie and personal programming rule is: keep it simple! ;) I've to > > understand the things I wrote. > > That's an excellent road to walk down! Handcrafted, simple code is better > than a mindless copy of something found somewhere. > > Kind regards > > robert >