Perlワンライナーの学習帳 〜参考資料と実用例〜

YAPC::Asia 2015の前夜祭で以下の発表を見て、その場ではハンズオンできなかった、という話は以下に書きましたが、

その後、公開されている資料をもとにちょこちょこ自習をやったりしたので、

その経過報告です。

参考資料群

Linuxコマンドもそうなのだけど、こういう操作ってまずはオプションの種類を把握していくことが結局重要なのかなと感じていて、その意味で上記の発表における「とりあえずこれを覚えておけばいい」みたいなオプションは、-n, -l, -e の3つなのかなと。

で、それらのオプションについては資料スライドだと以下のページにまとまっていますが、

そのスライド以外でも参考になった情報というのが結構あって(検索しまくった)、中でもわかりやすかった&楽しく読んだのはいつもお世話になっています小飼弾さんのブログの以下の記事。

たとえば上のスライドでは触れられていない -e と -E の違いや、

5.10.0 以降では、sayが加わったので、それを使うことも出来ます。ただし、これをワンライナーから利用するには-eではなく-Eを指定する必要があります。

また同様に時間の都合でスキップされていた -i, -MO=Deparse などについても触れられているので、その辺の知見も一気に体験することができて大変ありがたい内容でした。

あとはこちらもいつも拝読しています「たつをの ChangeLog」さんでも時々Perlワンライナーが紹介されていて、

上記などはとくに -aF オプションの実例としてわかりやすかったです。

あと、-p については以下が参考になりました。(それ以外も含めて網羅的に紹介されていますが)

さらにそれ以外だと、以下。

これも結構充実した内容で、それゆえまだあまり咀嚼できていないのですが、sedawkとつなげて学習できそうなので、楽しみに継続チェック中です。

実践

で、それらを踏まえつつ作ってみた私の初ワンライナーは以下の2つ。

$ perl -nle 'if($_=~/(https?:\S+)/){print $1;}' sample.txt
$ perl -nle 'if($_=~/(https?:\S+)/){print`open $1`;}' sample.txt

前者は、同ディレクトリ内の「sample.txt」に入った、「http」で始まる行を標準出力するだけのワンライナー
後者は、それをブラウザに展開するものですが、これは「open」というMac OSX用の(UNIXLinuxにはない)コマンドを使っているので、Macじゃないと使えないと思います。

追記:
コメント欄で @xtetsuji さんから教えて頂きましたが、後者の方は以下の方が意図に則しているようでした。
( {print `open $1`} としていた部分を {system "open", $1} に変更)

perl -nle 'if($_=~/(https?:\S+)/){system "open", $1;}' sample.txt

あわせて教えて頂いた、エラー処理(正常終了の確認)も含めて直してみようと思いましたが、これはちょっとわからなかったので宿題といたします・・。
(追記ここまで)

結構こういう、「ああ、このテキストファイルに集めたURL、一気にひらきたいな〜」ということがあるので、個人的にはいきなりなかなか実用的な内容です。

では試しに、ここまでに書いたこの記事を sample.txt に入れてやってみます。
(まずcatでsample.txtの中身を示してから、上記の前者、後者の順番で)

f:id:note103:20150926011714g:plain

何とかできたっぽいですね。

ということでワンライナー、これはこれでかなり奥が深そうですが、とりあえず最初の一歩ということで書いてみました。

上記の坂本さんが紹介されているこちらも機会があれば読んでみたいと思います。
https://www.swipe.to/7299cm#page=7kS98Sq0H

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法