Thursday, December 07, 2006

one lines intro good one

The TAPL book contains 20 examples of One-liners (A Handful of Useful awk One-Liners) at the end of the book's first chapter.

Here are the very first of them:

1. Print the total number of input lines:

END { print NR }

2. Print the tenth input line:

NR == 10

3. Print the last field of every input line:

{ print $NF }

Many one-liners are practical. For example, the following perl one-liner will reverse all the bytes in a file:

perl -0777e 'print scalar reverse <>' filename

One-liners are also used to show off the differential expressive power of programming languages. Frequently, one-liners are used to demonstrate programming ability. Contests are often held to see who can create the most exceptional one-liner.

The following example is a C program (a winning entry in the "Best one-liner" category of the IOCCC.)

main(int c,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);}

This one-liner program is a glob pattern matcher. It understands the glob characters `*' meaning `zero or more characters' and `?' meaning exactly one character, just like most Unix shells.

Run it with two args, the string and the glob pattern. The exit status is 0 (shell true) when the pattern matches, 1 otherwise. The glob pattern must match the whole string, so you may want to use * at the beginning and end of the pattern if you are looking for something in the middle. Examples:

$ prog foo 'f??'; echo $?
$ prog 'best short program' '??st*o**p?*'; echo $?

[edit] One-liner in functional programming

The following Haskell program is a one-liner, except for the two import statements. It sorts its input lines asciibetically.

import IO
import List
main = (sequence . map putStrLn . sort . lines) =<< getContents


[edit] One-liner in Java

public class OneLine { public static void main(String[] args) { System.out.println("One-liner."); } }

[edit] External links

* Perl Oneliners, showing off
* Perl One Liners, practical examples
* More Perl One Liners
* International Obfuscated C Code Contest, IOCCC

No comments: