読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

Perlでコマンド置換を使ってみよう

bashzshでは皆さんよく使っているであろうコマンド置換。

$ 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でもコマンドを変えると動くのかもしれませんが、あまりポータビリティはよくなさそうです。