-lwe
)-l
: Python のように、print
関数が改行するようにする-w
: プログラムの間違いを教えてくれるようにする-e
:
引数をプログラムとして実行する。複数使うと結合される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)
でも変わらないというだけである。
print "spam eggs"
)% perl -lwe 'print "spam eggs"'
spam eggs
数値に続いて文字列を表示してみよう。文字列は C や Python
と同様、クォーテーションマークで括る。ワンライナーをシェルのコマンドラインで書く都合上、二重のクォーテーションとなるが、外側のクォーテーションはシングル
''
にしておきたい。後でみるとおり、Perl
の変数にはシェルと同様 $
を使うため、ダブルクォーツで括るとシェルが変数を誤って展開してしまう。内側の、つまり
Perl としてのクォーツは当面ダブル ""
を使うことにする。
ところで Perl のクォーツはシェルスクリプトと同様、シングルとダブルで挙動が異なる。ダブルでは変数の展開などが行われるが、シングルでは行われない。これは後で見る。
print "Python", 3
)% perl -lwe 'print "Python", 3'
Python3
これは些末な点ではあるが、Perl の print
は(デフォルトで)引数の間を詰めて表示する。ここで見ておきたいのは、
Perl の関数がコンマ区切りの引数列を受け取るところである。 print("Python", 3)
と書くこともできる。
print 1 + 2 * 3
)% perl -lwe 'print 1 + 2 * 3'
7
Perl の四則演算はごく普通の、C 風の記法に見える。演算子が被演算子の間に来るこの形式は中置記法と呼ばれ、演算子には優先順位がある。 Lisp(前置記法)や PostScript(後置記法)のような言語とは異なる。
if (0) { print 42 }
)% perl -lwe 'if (0) { print 42 } else { print 256 }'
256
Perl の if 文は C 言語によく似ているが、いくつか注意点がある。
{}
で括る必要がある()
で括る必要があるelse if
ではなく elif
でもなく
elsif
であるなお、短く書くと print 0 ? 42 : 256
である。
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
の特徴的なもので、後で詳しく見る。
{}
で括る必要がある()
で括る必要があるのは if
文の条件式と同様であるbreak
, continue
ではなく
last
, next
であるsub f{ print 42 } f
)% perl -lwe 'sub f{ print 42 } f'
42
Perl のサブルーチン定義は、シェルスクリプトにある function f{ ... ;}
という形式に似ている。どう似ているかというと、定義の際に明示的にパラメタを取らないところである。どうやって引数を受け取るかについては、変数について触れた後で確認する。
なお余談であるが、シェルスクリプトで function f{ ... ;}; f
と書く場合、}
の前、および function f{ ... ;}
と f
の間にはセミコロンが必要である。セミコロンについては後ほど触れる。
print "spam"; print "eggs"
)% perl -lwe 'print "spam"; print "eggs"'
spam
eggs
Perl で複数の文を並べるときは、間に必ずセミコロンが必要である。
Python のように単一行に並べるときだけ、ではなく行を分けても必要である。
C のように各文の末尾に必ずつける必要はない。単一の文を -e
オプションに渡したり、単一の文を {}
で括ったりするときに、末尾の文につける必要はない。付けてもよい。
-p
,
-n
)ワンライナーの節の最後に、-p
と -n
について触れておく。
-n
:-p
:% seq 10 | perl -lwne 'print if /1/'
1
10
標準入力から読み取った行はデフォルト値になる。 print
関数の引数が省略されているのでデフォルト値が使われる。 /1/
は正規表現であるが、これもデフォルト値に対してマッチングを行う。
正規表現については後ほど詳しく述べる。