Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
One-liner program
(section)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Examples== One-liners are also used to show off the differential expressive power of [[programming language]]s. Frequently, one-liners are used to demonstrate programming ability. Contests are often held to see who can create the most exceptional one-liner. ===BASIC=== [[File:10print.gif|thumb|Simulated output of the ''10PRINT'' one-liner BASIC program for the Commodore 64]] A single line of BASIC can typically hold up to 255 characters, and one liners ranged from simple games<ref>{{cite web |title=Acorn User One-Line Games (Escape From Voros, Lexxias, Race To Varpon, Storm Clouds Over Zaqqit, Zander (AKA Lurch)) |url=http://bbcmicro.co.uk/game.php?id=2718 |website=bbcmicro.co.uk |accessdate=3 July 2018 |language=en}}</ref> to graphical demos. One of the better-known demo one-liners is colloquially known as ''10PRINT'', written for the [[Commodore 64]]: <syntaxhighlight lang="cbmbas"> 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 </syntaxhighlight> ===C=== The following example is a [[C (programming language)|C]] program (a winning entry in the "Best one-liner" category of the [[IOCCC]]). <syntaxhighlight lang="C"> 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);} </syntaxhighlight> This one-liner program is a glob pattern matcher. It understands the glob characters {{code|*}}, meaning zero or more characters, and {{code|?}}, meaning exactly one character, just like most [[Unix shell]]s. 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: <syntaxhighlight lang="console"> $ ./a.out foo 'f??'; echo $? $ ./a.out 'best short program' '??st*o**p?*'; echo $? </syntaxhighlight> ===AWK=== The book ''[[The AWK Programming Language]]'' contains 20 examples of ''one-liners'' at the end of the book's first chapter. Here are the very first of them: # Print the total number of input lines (like [[wc (Unix)|wc -l]]): <syntaxhighlight lang="awk">END { print NR }</syntaxhighlight> # Print the tenth input line: <syntaxhighlight lang="awk">NR == 10</syntaxhighlight> # Print the last field of every input line: <syntaxhighlight lang="awk">{ print $NF }</syntaxhighlight> ===J=== Here are examples in [[J (programming language)|J]]: * A function avg to return the average of a list of numbers: <syntaxhighlight lang="j">avg=: +/ % #</syntaxhighlight> * [[Quicksort]]: <syntaxhighlight lang="j">quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)</syntaxhighlight> ===Perl=== Here are examples in the [[Perl]] [[programming language]]: * Look for duplicate words perl -0777 -ne '<syntaxhighlight lang="perl" inline>print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi</syntaxhighlight>' * Find Palindromes in /usr/dict/words perl -lne '<syntaxhighlight lang="perl" inline>print if $_ eq reverse</syntaxhighlight>' /usr/dict/words * in-place edit of *.c files changing all foo to bar perl -p -i.bak -e '<syntaxhighlight lang="perl" inline>s/\bfoo\b/bar/g</syntaxhighlight>' *.c Many one-liners are practical. For example, the following [[Perl]] one-liner will reverse all the bytes in a file: <syntaxhighlight lang="bash"> perl -0777e 'print scalar reverse <>' filename </syntaxhighlight> While most [[Perl]] one-liners are imperative, Perl's support for anonymous functions, closures, map, filter ([[grep]]) and fold (List::Util::reduce) allows the creation of 'functional' one-liners. This one-liner creates a function that can be used to return a list of primes up to the value of the first parameter: <syntaxhighlight lang="perl"> my $z = sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) } </syntaxhighlight> It can be used on the command line, like this: perl -e'<syntaxhighlight lang="bash" inline>$,=",";print sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }->(shift)</syntaxhighlight>' number to print out a comma-separated list of primes in the range 2 - number. ===Haskell=== The following [[Haskell (programming language)|Haskell]] program is a one-liner: it sorts its input lines [[ASCII#Order|ASCIIbetically]]. <syntaxhighlight lang="haskell"> main = (mapM_ putStrLn . Data.List.sort . lines) =<< getContents -- In ghci a qualified name like Data.List.sort will work, although as a standalone executable you'd need to import Data.List. </syntaxhighlight> An even shorter version: <syntaxhighlight lang="haskell"> main = interact (unlines . Data.List.sort . lines) -- Ditto. </syntaxhighlight> Usable on the command line like: <syntaxhighlight lang="bash"> cat filename | ghc -e "interact (unlines . Data.List.sort . lines)" </syntaxhighlight> ===Racket=== The following [[Racket (programming language)|Racket]] program is equivalent to the above Haskell example: <syntaxhighlight lang="racket"> #lang racket (for-each displayln (sort (port->lines) string<?)) </syntaxhighlight> and this can be used on the command line as follows: racket -e '<syntaxhighlight lang="racket" inline>(for-each displayln (sort (port->lines) string<?))</syntaxhighlight>' ===Python=== Performing one-liners directly on the Unix command line can be accomplished by using [[Python (programming language)|Python]]'s -cmd flag (-c for short), and typically requires the import of one or more modules. Statements are separated using ";" instead of newlines. For example, to print the last field of unix long listing: ls -l | python -c "<syntaxhighlight lang="python" inline> import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]</syntaxhighlight>" ====Python wrappers==== Several open-source scripts have been developed to facilitate the construction of Python one-liners. Scripts such as [http://code.google.com/p/pyp/ pyp] or [http://code.activestate.com/recipes/437932-pyline-a-grep-like-sed-like-command-line-tool/ Pyline] import commonly used modules and provide more human-readable variables in an attempt to make Python functionality more accessible on the command line. Here is a redo of the above example (printing the last field of a unix long listing): <syntaxhighlight lang="bash"> ls -l | pyp "whitespace[-1]" # "whitespace" represents each line split on white space in pyp ls -l | pyline "words[-1]" # "words" represents each line split on white space in pyline </syntaxhighlight> ====Executable libraries==== The Python CGIHTTPServer module for example is also an executable library that performs as a web server with CGI. To start the web server enter: <syntaxhighlight lang="console">$ python -m CGIHTTPServer Serving HTTP on 0.0.0.0 port 8000 β¦</syntaxhighlight> ===Tcl=== [[Tcl]] (Tool Command Language) is a dynamic programming/scripting language based on concepts of Lisp, C, and Unix shells. It can be used interactively, or by running scripts (programs) which can use a package system for structuring.<ref>Following are direct quotes from {{Wikibooks-inline|Tcl Programming}} that are available under the [[Creative Commons Attribution-ShareAlike License]].</ref> Many strings are also well-formed lists. Every simple word is a list of length one, and elements of longer lists are separated by whitespace. For instance, a string that corresponds to a list of three elements: <syntaxhighlight lang="TCL"> set example {foo bar grill} </syntaxhighlight> Strings with unbalanced quotes or braces, or non-space characters directly following closing braces, cannot be parsed as lists directly. You can explicitly split them to make a list. The "constructor" for lists is of course called list. It's recommended to use when elements come from variable or [[command substitution]] (braces won't do that). As Tcl commands are lists anyway, the following is a full substitute for the list command: <syntaxhighlight lang="TCL"> proc list args {set args} </syntaxhighlight> ===Windows PowerShell=== Finding palindromes in file words.txt <syntaxhighlight lang="powershell"> Get-Content words.txt | Where { $_ -eq -join $_[($_.length-1)..0] } </syntaxhighlight> Piping semantics in PowerShell help enable complex scenarios with one-liner programs. This one-liner in PowerShell script takes a list of names and counts from a comma-separated value file, and returns the sum of the counts for each name. <syntaxhighlight lang="powershell"> ipcsv .\fruit.txt βH F, C|Group F|%{@{"$($_.Name)"=($_.Group|measure C -sum).Sum}}|sort value </syntaxhighlight>
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)