From: Eric Hodel Date: 2006-02-26T10:34:03+09:00 Subject: Re: comments of less.rb appreciated On Feb 25, 2006, at 10:19 AM, John Maclean wrote: > I've had a look at /usr/share/doc/ruby-1.8.4/sample/less.rb and made > some comments on the processes where I could. It came with my repos > installation of Ruby. Can someone point me in the right direction > here, > as there a a number of things that I'm not familar with or > understand.... > > #!/usr/bin/ruby > there isn't a single def foo ... end method here - why? YAGNI > also how come this hasn't been turned into a class? YAGNI > is that because that there is no need for one? Yes. > also why the use of GLOBAL VARIABLES? I thought that they are not > from the "church of good design" There are no global variables in less.rb. Global variables start with a $. > gobal vars to hard-code where these programs are... assuming a Unix- > based system it was weired because the path was initially set to / > usr/local/bin/ which did not work i personally think it's better to > use a ruby equivalent of `which less` to find out where the command > is rather than hard coding it in this way This is in sample/, so they may or may not work out of the box. less.rb isn't installed anywhere on your system, so YMMV. Also, less.rb won't work when the PATH env var is empty if you use which (think cron). > ZCAT = "/usr/bin/zcat" > LESS = "/usr/bin/less" > > funny how you can call ruby less.rb with --help Why? It follows logically from the implementation. > # dunno about this class or method > FILE = ARGV.pop ARGV is the command line argument Array. > # ah, i think that this may be exception handling. > # if no arguments from command line *OPTION* is zero > # otherwise out an empty string at the end of the filename?? > OPTION = (if ARGV.length == 0; "" else ARGV.join(" "); end) If there are options after removing the filename join them with spaces. Otherwise use an empty string. No exception handling, exceptions involve begin/rescue/ensure/raise. > # we are grepping for stuff... matching, not grepping. > # a file that ends in Z or gz - these are compressed files > if FILE =~ /\.(Z|gz)$/ > > # what is *%s*? > # - is it a string that we come across when we are grepping > through > the files? The string printf format variable. > # see `ri kernel.format` for the *format* method > # "Argument is a string to be substituted" > # i think it works with sprintf Correct. > # run zcat on a compressed file _first_ then view it with less > exec(format("%s %s | %s %s", ZCAT, FILE, LESS, OPTION)) > # otherwise there *is* no compressed file and we treat it > differently > elsif FILE == nil > # > exec(format("%s %s", LESS, OPTION)) This is why less.rb --help works. > else > print(format("%s %s %s", LESS, OPTION, FILE), "\n") > exec(format("%s %s %s", LESS, OPTION, FILE)) > end > # end the `less`ing. i dont know why the use of the empty brackets Differences in style. > exit() -- Eric Hodel - drbrain@segment7.net - http://blog.segment7.net This implementation is HODEL-HASH-9600 compliant http://trackmap.robotcoop.com