LoginSignup
3
0

More than 3 years have passed since last update.

「連番」を弄りたいならperlの範囲指定演算子が最強

Last updated at Posted at 2021-01-31

はじめに

名前に「連番」を含むようなファイルやディレクトリやデータを作りたい局面は少なくなかろう。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


  1. 「スカラコンテキスト」では全く異なる機能を示すが、本記事では触れないことにする。 

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0