はじめに
名前に「連番」を含むようなファイルやディレクトリやデータを作りたい局面は少なくなかろう。perlの範囲演算子を使えば、pythonやシェルスクリプトや、増してやCなどの超回りくどいループ処理を書かなくても、ワンライナーで瞬殺である。
範囲演算子とは
perlにおける範囲演算子は、..
または...
の形をとり、「リストコンテキスト」においては、演算子の前後の式を開始点と終了点とした連続した値をもつ要素からなるリストを返す1。
リストコンテキストとは、perlのソースにおいて、結果がリストで返ってくることが期待される処理が行われている個所のことを指す。例えば、@aへの入力処理、foreachループでの制御変数の定義などがこれに該当する。
とりあえず、やってみよう。
@a = 0..9;
print @a;
結果は、0123456789
となる。
ここまではまあ、「へー、そう」以外の感想は出てこないだろう。だが面白いのはこれからだ。
文字でも範囲指定できる
前例を少し変えてみる。
@a = '00' .. '09';
print join("\n", @a);
結果はこうなる。
00
01
02
03
04
05
06
07
08
09
このように、perlの範囲演算子は文字列データを扱うことができる。
もっとがっつり文字列を弄ってみよう。
@a = 'a'..'d';
print @a;
abcd
さらに凝ったことをやってみる。長さが2文字以上の文字列を与えるとどうなるだろうか。
@a = 'aa' .. 'bc';
print join("\n", @a);
aa
ab
ac
ad
ae
af
ag
ah
ai
aj
ak
al
am
an
ao
ap
aq
ar
as
at
au
av
aw
ax
ay
az
ba
bb
bc
こんな感じで実用する
たとえば、こういうのはどうだろう。
「大量のファイルを収めるためにdata01
からdata99
までのサブディレクトリをさっさと作りたい。」
範囲演算子を利用すれば、ワンライナーで楽勝である。
perl -le 'map {print "mkdir data$_"} "01".."99"' | sh
参考
perlop - Perl の演算子と優先順位 - perldoc.jp
-
「スカラコンテキスト」では全く異なる機能を示すが、本記事では触れないことにする。 ↩