Perlでコマンド置換を使ってみよう
bashやzshでは皆さんよく使っているであろうコマンド置換。
$ mv `ls | grep .txt | grep blog` Downloads/
みたいな感じで、バッククオートで囲んだところを実行して、コマンドの実行結果に置き換えてくれます。
このコマンド置換、実はPerlでも使えるみたいです。
my @list = split /\n/, `ls | grep .txt | grep blog`; print join("\n", @list), "\n";
こんな感じで実行できます。これはデータを抽出する場合ですね。コマンド置換の結果はただの文字列なので、splitなどで適当に処理してやる必要があります。
データを抽出するだけでなく、「mv」や「rm」でファイル操作なども行えます。
また、コマンド置換のリストにPerlの変数も使えるみたいです。
my @list = split /\n/, `ls | grep .txt | grep blog`; `mv $_ Downloads/` for @list;
Perlでおなじみの変数「$_」もちゃんと展開されるみたいですよ。
まあ、上記のような内容なら、Perlスクリプト内でコマンド置換をわざわざ使う必要はないわけですが、正規表現やsprintfで文字列を整えてからコマンドに渡したいときなんかは使えるかもしれませんね。
ちなみに、Perl内のコマンド置換はワンライナーでも使えるみたいです。
$ perl -e 'do { $i = sprintf "P%02d", $_; `mkdir $i` } for 1..10'
こんな感じとか、
$ perl -e 'do { $id = sprintf "%02d", $_; @name = split /\n/, `ls | grep $id`; `mv @name Downloads/` } for 1..10'
こんな感じです。もはやなにが目的かわからないですね。
ちなみに、ここら辺のスクリプトは全部Mac上で試しています。Windowsでもコマンドを変えると動くのかもしれませんが、あまりポータビリティはよくなさそうです。