« プログラミングを始めるには(23) | Main | プログラミングを始めるには(25) »

August 21, 2014

プログラミングを始めるには(24)

前々囘から以下の手順をelispで書くとどうなるかという、プログラムを初めて書こうとしている人が考えそうなネタについて考えている。しかし、これがelispビギナーに興味あるネタかどうかは自信がない。ではこの問題を他の方法でやろうとするとどうなるのかについて考えてみたい。

(1) カーソルをバッファの先頭に移動する。
(2) カーソルを5行下に移動する。
(3) カーソルがある行をkillする。
(4) カーソルをバッファの終端に移動する。
(5) カーソルのある位置にkillした行をyankする。

まず、Emacsの永遠のライバル?vi (ex)でやるとどうなるのか。

#!/bin/sh

ex -e -s <<EOF $1
:6,6 m $
:wq!
EOF

exのプログラムというのはないが、上記のようにサイレントモードで編集手順を書くことは出來る。なんと(1)から(5)の操作をたった1行で出來てしまう。この效率の良さからvi (ex)Emacsよりも優秀なエディタとする議論があるのかもしれない。ただ、Emacsには昔からviのエミュレーションモードがいくつかあり、viのようなコマンドの方が編集效率が良い場合はその操作性をEmacsの中で利用出來るようになっている。

有名なsedでやるとこうなる。

#!/bin/sh

TEMPFILE=`mktemp`

cat > $TEMPFILE <<EOF
1,5p
7,\$p
6h
g
\$p
1,\$d
EOF

sed -f $TEMPFILE $1

rm -f $TEMPFILE

(1) パターンスペースの1行目から5行目までプリントする。
(2) パターンスペースの7行目から最終行までプリントする。
(3) パターンスペースの6行目をホールドスペースにコピーする。
(4) ホールドスペースをパターンスペースにコピーする。
(5) パターンスペースの最終行をプリントする。
(6) パターンスペース全體を削除する。

sedは全然分からないのでアレコレ試して、適當な名前のスクリプトファイルに上記のように書いてやっと目的の結果になった。しかし、なぜこういう手順で良いのかサッパリ分からないので說明出來ない。たぶん慣れた人ならもっとシンプルかつ效率的に書くのだろう。

#!/bin/awk -f

NR >= 1  {
    line[NR] = $0;
}

END {
    for (i = 1; i <= 5; i++) {
	print line[i];
    }
    for (i = 7; i <= NR; i++) {
	print line[i];
    }
    print line[6];
}

さらに有名なawkでやるとこうなる。sedのクセで惱んだおかげで經驗値が上がったのか、こちらはあまり惱まずに濟んだ。しかし、sedawkも讀み込んだストリームの狀態を想像して書かないといけないので、複雜な條件で複雜なことをやろうとすると、頭が良い人じゃないとキツい氣がする。たぶんperlも同じようなものだろう。單純に1〜5行と7行〜最終行を先にプリントして、最後に6行目をプリントすると書いても、要するに入力ストリームを全行プリントと解釋されてしまうのだ。

|

« プログラミングを始めるには(23) | Main | プログラミングを始めるには(25) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60188002

Listed below are links to weblogs that reference プログラミングを始めるには(24):

« プログラミングを始めるには(23) | Main | プログラミングを始めるには(25) »