Perl 練習帳

はじめに

ワンライナーを書く

perl のオプション (-lwe)

Perl の文法 (print 42)

% perl -lwe 'print 42'
42

Perl の文法は C や Python にやや似ているところがある。 Python を学んだ時、C とシェルスクリプトの両方の要素が入っていると感じたが、 Perl にも同様の感じがある。 Perl は Python と比べるとシェルスクリプトの影響が強い感じがする。

まずは print 42 であるが、Python 2 の print 文に見えるが、これはれっきとした関数である。 C 風の言語に共通のルールで、式は単独で文(式文)になることができる。したがって print 42 は関数で、同時に文でもある。これが関数に見えないのは C や Python の関数呼び出し演算子が括弧であり、 print(42) のように書く癖がついているからである。実際のところ Perl でも print(42) と書くことができるが、これは 42 でも (42) でも変わらないというだけである。

Perl の文法 (print "spam eggs")

% perl -lwe 'print "spam eggs"'
spam eggs

数値に続いて文字列を表示してみよう。文字列は C や Python と同様、クォーテーションマークで括る。ワンライナーをシェルのコマンドラインで書く都合上、二重のクォーテーションとなるが、外側のクォーテーションはシングル '' にしておきたい。後でみるとおり、Perl の変数にはシェルと同様 $ を使うため、ダブルクォーツで括るとシェルが変数を誤って展開してしまう。内側の、つまり Perl としてのクォーツは当面ダブル "" を使うことにする。

ところで Perl のクォーツはシェルスクリプトと同様、シングルとダブルで挙動が異なる。ダブルでは変数の展開などが行われるが、シングルでは行われない。これは後で見る。

Perl の文法 (print "Python", 3)

% perl -lwe 'print "Python", 3'
Python3

これは些末な点ではあるが、Perl の print は(デフォルトで)引数の間を詰めて表示する。ここで見ておきたいのは、 Perl の関数がコンマ区切りの引数列を受け取るところである。 print("Python", 3) と書くこともできる。

Perl の文法 (print 1 + 2 * 3)

% perl -lwe 'print 1 + 2 * 3'
7

Perl の四則演算はごく普通の、C 風の記法に見える。演算子が被演算子の間に来るこの形式は中置記法と呼ばれ、演算子には優先順位がある。 Lisp(前置記法)や PostScript(後置記法)のような言語とは異なる。

Perl の文法 (if (0) { print 42 })

% perl -lwe 'if (0) { print 42 } else { print 256 }'
256

Perl の if 文は C 言語によく似ているが、いくつか注意点がある。

なお、短く書くと print 0 ? 42 : 256 である。

Perl の文法 (for (0..4) { print })

% perl -lwe 'for (0..4) { print }'
0
1
2
3
4

Perl の for 文には C 言語に似た形式もあるのだが、まず Python に似た形式から見ておく。この 0..4 は Python における range(0, 4) に似た効果を持つが、結果は上記の通りで、 [0, 4) ではなく [0,4] である。

まだ変数について触れていないので、ここでは変数を介さない方式を見る。変数を指定しないとき、for 文のイテレータ値は print 関数のデフォルト値となる。この機能は Perl の特徴的なもので、後で詳しく見る。

Perl の文法 (sub f{ print 42 } f)

% perl -lwe 'sub f{ print 42 } f'
42

Perl のサブルーチン定義は、シェルスクリプトにある function f{ ... ;} という形式に似ている。どう似ているかというと、定義の際に明示的にパラメタを取らないところである。どうやって引数を受け取るかについては、変数について触れた後で確認する。

なお余談であるが、シェルスクリプトで function f{ ... ;}; f と書く場合、} の前、および function f{ ... ;}f の間にはセミコロンが必要である。セミコロンについては後ほど触れる。

Perl の文法 (print "spam"; print "eggs")

% perl -lwe 'print "spam"; print "eggs"'
spam
eggs

Perl で複数の文を並べるときは、間に必ずセミコロンが必要である。 Python のように単一行に並べるときだけ、ではなく行を分けても必要である。 C のように各文の末尾に必ずつける必要はない。単一の文を -e オプションに渡したり、単一の文を {} で括ったりするときに、末尾の文につける必要はない。付けてもよい。

perl のオプション (-p, -n)

ワンライナーの節の最後に、-p-n について触れておく。

% seq 10 | perl -lwne 'print if /1/'
1
10

標準入力から読み取った行はデフォルト値になる。 print 関数の引数が省略されているのでデフォルト値が使われる。 /1/ は正規表現であるが、これもデフォルト値に対してマッチングを行う。

正規表現については後ほど詳しく述べる。