コンピュータプログラミングにおいて、ワンライナープログラムは元々、オペレーティングシステムシェルのコマンドラインにテキスト入力され、たった1行の入力で何らかの機能を実行するものでした。現在では、ワンライナーは
- シェルの言語で書かれた表現。
- インタープリタを実行するためのプログラムソースとともにインタープリタを呼び出すこと。
- コンパイルするソースとコンパイルされたプログラムを実行するための命令とともにコンパイラを呼び出すこと。
AWK、sed、Perlなどの特定の動的スクリプト言語は、従来からワンライナーの表現に長けています。UnixシェルやWindows PowerShellなどのシェル インタープリターを使用すると、強力なワンライナーを作成できます。
「ワンライナー」という語句の使用範囲が広がり、1 行で何か役に立つことを実行するあらゆる言語のプログラム ソースも含まれるようになりました。
歴史
ワンライナープログラムの概念は、1960年代[1]のAPLプログラミング言語のリリース以来知られています。簡潔な構文と強力な数学演算子を備えたAPLは、便利なプログラムを少数の記号で表現することを可能にしました。
1970年代には、ワンライナーは家庭用コンピュータとBASICの台頭と結び付けられるようになった。コンピュータ雑誌はBASICの多くの方言で入力プログラムを掲載した。いくつかの雑誌は、印象的な短いワンライナープログラムだけを特集した定期的なコラムを書いた。[2]
ワンライナーという言葉は、 The AWK Programming Language (この本は略語TAPLでよく呼ばれる)という本の索引にも 2 回登場します。この本では、 Unixオペレーティングシステムの一部であるプログラミング言語AWKについて説明しています。著者は、初期のUnixマシン での日々の作業からワンライナーパラダイムの誕生について説明しています。
1977 年版には、組み込み変数と定義済み関数がわずかしかありませんでした。短いプログラムを書くために設計されました […] 私たちのモデルは、呼び出しが 1 行または 2 行で、入力してすぐに使用するというものでした。このスタイルに合わせてデフォルトが選択されました […] 作者である私たちは、言語がどのように使用されるべきかを知っていたので、1 行のコードだけを書きました。
ワンライナーのこの本来の定義は、コンパイルなしでプログラムを即時実行することを意味することに注意してください。したがって、厳密には、インタープリタ型言語のソースコードのみがワンライナーとして適格です。ただし、ワンライナーのこの厳密な理解は、1985 年にIOCCC がコンパイル言語であるCのベストワンライナーのカテゴリを導入したときに拡大されました。
例
ワンライナーは、プログラミング言語の差別化された表現力を披露するためにも使用されます。 多くの場合、ワンライナーはプログラミング能力を実証するために使用されます。 最も優れたワンライナーを作成できる人を競うコンテストが頻繁に開催されます。
ベーシック

BASICの1行は通常255文字まで格納でき、ワンライナーは単純なゲーム[3]からグラフィカルなデモまで多岐にわたります。よく知られているデモワンライナーの1つは、コモドール64用に書かれた10PRINTとして知られています。
10 CHR$ ( 205.5 + RND ( 1 )を印刷します。: GOTO 10
C
次の例は、Cプログラム ( 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 );}
このワンライナープログラムは、glob パターン マッチャーです。ほとんどのUnix シェルと同様に、glob 文字 ( *0 個以上の文字を意味する) と、正確に 1 文字を意味する を理解します。
?
文字列と glob パターンの 2 つの引数を付けて実行します。パターンが一致すると終了ステータスは 0 (シェルが真)、そうでない場合は 1 になります。glob パターンは文字列全体と一致する必要があるため、中間部分を検索する場合はパターンの先頭と末尾に * を使用することをお勧めします。例:
$ ./a.out foo 'f??' ; echo $? $ ./a.out 'best short program' '??st*o**p?*' ; echo $?
AWK
『 The AWK Programming Language』という本の第 1 章の最後に、 ワンライナーの例が 20 個掲載されています。
最初のものは次のとおりです。
- 入力行の合計数を出力します(wc -lと同様)。
END { NRを印刷 }
- 10番目の入力行を出力します。
NR == 10
- すべての入力行の最後のフィールドを出力します。
{ $ NF を印刷 }
J
Jの例を以下に示します。
- 数値リストの平均を返す関数 avg:
平均=: +/ % #
- クイックソート:
クイックソート=: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )
パール
- 重複した単語を探す
パール -0777 -ne ' '
print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi
- /usr/dict/words で回文を検索する
perl -lne ' ' /usr/dict/words
print if $_ eq reverse
- *.c ファイルのインプレース編集ですべての foo を bar に変更する
perl -p -i.bak -e ' s/\bfoo\b/bar/g' *.c
多くのワンライナーは実用的です。たとえば、次のPerlワンライナーはファイル内のすべてのバイトを反転します。
perl -0777e 'print scalar backward <>'ファイル名
Perl のワンライナーのほとんどは命令型ですが、匿名関数、クロージャ、マップ、フィルタ (grep)、フォールド (List::Util::reduce) に対する Perl のサポートにより、「関数型」ワンライナーを作成できます。
このワンライナーは、最初のパラメータの値までの素数のリストを返すために使用できる関数を作成します。
私の$z = sub { grep { $a = $_ ; ! grep { ! ( $a % $ _ ) } ( 2 .. $_ - 1 )} ( 2 .. $_ [ 0 ]) }
次のようにコマンドラインで使用できます。
perl -e' ' 番号
$,=",";print sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }->(shift)
2 - 数値の範囲の素数をコンマで区切ってリストにして出力します。
ハスケル
次のHaskellプログラムはワンライナーです。入力行をASCII 順にソートします。
main = ( mapM_ putStrLn . Data . List . sort .lines ) =<< getContents -- ghci では Data.List.sort のような修飾名が機能しますが、スタンドアロン実行可能ファイルとしては Data.List をインポートする必要があります。
さらに短いバージョン:
main = interact ( unlines . Data . List . sort .lines ) -- 同じです。
次のようにコマンドラインで使用できます:
cat ファイル名| ghc -e "interact (unlines . Data.List.sort .lines)"
ラケット
次のRacketプログラムは、上記の Haskell の例と同等です。
#lang racket
( for-each displayln ( sort ( port->lines )文字列<? ))
これは次のようにコマンドラインで使用できます。
ラケット -e ' '
(for-each displayln (sort (port->lines) string<?))
パイソン
Unix コマンドラインで直接ワンライナーを実行するには、Pythonの -cmd フラグ (省略形は -c) を使用します。通常は、1 つ以上のモジュールをインポートする必要があります。ステートメントは、改行ではなく ";" を使用して区切られます。たとえば、Unix の長いリストの最後のフィールドを出力するには、次のようにします。
ls -l | python -c " "
import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]
Python ラッパー
Python ワンライナーの構築を容易にするために、いくつかのオープンソース スクリプトが開発されています。pyp や Pyline などのスクリプトは、よく使用されるモジュールをインポートし、より人間が判読しやすい変数を提供して、コマンドラインで Python の機能にアクセスしやすくします。上記の例をもう一度実行したものを次に示します (Unix の長いリストの最後のフィールドを出力します)。
ls -l | pyp "whitespace[-1]" # "whitespace" は pyp 内の空白で分割された各行を表します
ls -l | pyline "words[-1]" # "words" は pyline 内の空白で分割された各行を表します
実行可能ライブラリ
たとえば、Python CGIHTTPServer モジュールも、CGI を備えた Web サーバーとして機能する実行可能ライブラリです。Web サーバーを起動するには、次のように入力します。
$ python -m CGIHTTPServer
0.0.0.0 ポート 8000 で HTTP を提供しています…
Tcl
Tcl(Tool Command Language)は、Lisp、C、Unixシェルの概念に基づいた動的プログラミング/スクリプト言語です。対話的に使用することも、パッケージシステムを使用して構造化できるスクリプト(プログラム)を実行することもできます。[4]
多くの文字列は整形式リストでもあります。すべての単純な単語は長さ 1 のリストであり、長いリストの要素は空白で区切られます。たとえば、3 つの要素のリストに対応する文字列は次のようになります。
例を設定する{ foo bar grill }
不均衡な引用符や中括弧、または閉じ括弧の直後にスペース以外の文字がある文字列は、リストとして直接解析することはできません。明示的に分割してリストを作成できます。
リストの「コンストラクタ」は、もちろん list と呼ばれます。要素が変数またはコマンドの置換から取得される場合は、これを使用することをお勧めします (中括弧ではこれが実行されません)。Tcl コマンドはいずれにせよリストであるため、次のコマンドは list コマンドの完全な代替です。
proc引数 リスト{引数の設定}
Windows PowerShell
ファイル words.txt 内の回文の検索
Get-Content words . txt | Where { $_ -eq -join $_ [( $_ . length - 1 ).. 0 ] }
PowerShell のパイプ セマンティクスは、ワンライナー プログラムで複雑なシナリオを実現するのに役立ちます。このワンライナー PowerShell スクリプトは、コンマ区切り値ファイルから名前とカウントのリストを取得し、名前ごとにカウントの合計を返します。
ipcsv .\ fruit . txt – H F , C | Group F |%{@{ " $( $_ . Name ) " =( $_ . Group | measure C -sum ). Sum }}|ソート値
参照
参考文献
- ^ 10 印刷 CHR$ (205.5 + RND (1)); : 後藤 10 (PDF)。ミットプレス。 2014.p. 148.ISBN 9780262526746. 2018年7月3日閲覧。
- ^ 「RUNマガジン第35号」1986年11月。
- ^ 「Acorn User One-Line Games (Escape From Voros、Lexxias、Race To Varpon、Storm Clouds Over Zaqqit、Zander (AKA Lurch))」。bbcmicro.co.uk 。 2018年7月3日閲覧。
- ^ 以下は直接引用です
Wikibooks の Tcl プログラミングは、 Creative Commons Attribution-ShareAlike Licenseに基づいて利用できます。
外部リンク
- Perl プログラミング リンク
- Wikibooks無料 Tcl プログラミング入門 & PDF のダウンロード
- SourceForge、ダウンロードウェブサイト、そして複数のコンピュータ言語
- Tcl Sources、Tcl および Tk ソースコードの主なダウンロード Web サイト
- Tcler の Wiki、Tcl/Tk スクリプトとリファレンスのクリアリング ハウス
- TkDocs、Tcl/Tk 公式ドキュメントとアーカイブ
