リスト

複数の値をまとめて操作する時、リストを使う。

リストとは - リストと配列 - Perl入門
リストと配列の使い方

リストは、複数の変数やリテラルなどをカンマで区切って、括弧で全体を括っている。
変数や配列のようなオブジェクトではなく、表現という形に近いかな。

リストを使って、変数をまとめると、1行で3つの変数に一気に値をセットすることなどができる。
柔軟で不思議な書き方である。
配列の初期化にもリストを使う。

$ vi list.pl
$ perl list.pl
$x = 10, $y = 20, $z = 30
$array[0] = 100
$array[1] = 200
$array[2] = 300
$

このように一気にセットされている。

Sample/perl/list/list/src/list at master · bg1bgst333/Sample · GitHub

パターンマッチ演算子

特定の文字列変数が、正規表現のパターンにマッチするかどうかをチェックする時には、パターンマッチ演算子を使う。

perlreref - Perl の正規表現のリファレンス - perldoc.jp
Perlの正規表現をマスターしよう - Perl入門ゼミ
「=~」 - パターンマッチ演算子 - Perl入門ゼミ

入力した$targetが、「"AbC"または"ABC"」に一致するかをチェックしている。
前回のif文の条件式は、これの省略形である。変数を介さなければ、正規表現の部分の記述だけで済む。

$ vi pattern_match_operator.pl
$ perl pattern_match_operator.pl
hoge
not match /A[bB]C/
$ perl pattern_match_operator.pl
AcC
not match /A[bB]C/
$ perl pattern_match_operator.pl
ABC
match /A[bB]C/
$ perl pattern_match_operator.pl
AbC
match /A[bB]C/
$ perl pattern_match_operator.pl
abc
not match /A[bB]C/
$

ちゃんとチェック出来てる。

Sample/perl/pattern_match_operator/pattern_match_operator/src/pattern_match_operator at master · bg1bgst333/Sample · GitHub

正規表現

Perlの特徴的な機能の一つに正規表現がある。

perlreref - Perl の正規表現のリファレンス - perldoc.jp
Perlの正規表現をマスターしよう - Perl入門ゼミ

簡単に言うと、特定パターンの文字列を探すための機能。

<IN>で入力された行が、A[bB]C("AbC"または"ABC")かどうかを判定しているのだが、while文の条件式もif文の条件式も省略されているところが注意点。
"/"と"/"で挟まれている部分が文字列パターン。

$ vi regular_expression.pl
$ cat test.txt
ABC
DEF
GHI
aaB
aBC
BAC
AAC
AbC
AaB
Abc
$ perl regular_expression.pl
1:ABC
8:AbC
$

test.txtにあれだけの文字列パターンがあって、"A[bB]C"に合致するのは、1番目と8番目。

Sample/perl/regular_expression/regular_expression/src/regular_expression at master · bg1bgst333/Sample · GitHub

特殊変数

Perlには、特別な意味を持つグローバル変数「特殊変数」がたくさん用意されている。

perlvar - Perl で定義済みの変数 - perldoc.jp
Perlの特殊変数 - Perl入門ゼミ

whileの条件式に<IN>だけ書いている。
渡す相手がいないわけだが、実際には読み込んだ行文字列は、特殊変数"$_"に格納されている。
("$_"はデフォルト変数などと呼ばれている。)
また、"$."はファイルハンドルの現在の行番号を表している。

$ vi special_variable.pl
$ ls
special_variable.pl  test.txt
$ cat test.txt
ABC
DEF
GHI
JKL
MNO
$ perl special_variable.pl
1:ABC
2:DEF
3:GHI
4:JKL
5:MNO
$

特殊変数を使って、行番号と行の内容を出力できた。

Sample/perl/special_variable/special_variable/src/special_variable at master · bg1bgst333/Sample · GitHub

die

dieは、関数にエラーが発生した時、エラーメッセージを出してプログラムを終了する。

die関数 - プログラム制御に関する関数 - Perl関数のリファレンス

openに失敗した時、dieに渡したらどうなるか。

$ vi die.pl
$ ls
die.pl
$ perl die.pl
open error!! at die.pl line 4.
$

"test.txt"がないので、エラーメッセージが出た。

Sample/perl/die/die/src/die at master · bg1bgst333/Sample · GitHub

シンボル

これまで出てきたファイルハンドルと言われるSTDINとかINとかOUTとか呼ばれるものは、実際にはファイルハンドルの一種でシンボルというものらしい。
(他にもいろいろあるが、ファイルハンドルについてはいずれ扱う。)

ファイルハンドルの概念を理解する - Perl入門ゼミ

変数やリテラルではなく、シンボルという形で、プログラム上にいきなり表れてもそこで定義されたものとされる模様。
(変数とかも一応宣言不要ではあるが、宣言を強制したりするのが一般的ではある。)
STDINやSTDOUTはシステム定義だとおもうが、INやOUTなどファイルに付けるものは自由に名前を付けても動くようになっている。

今回は読みだしたテキストを別のファイルに書き込む。
INでの読み込み方法に加えてOUTでの書き込み方法について扱う。

openで"output.txt"を生成し、ファイルハンドルをOUTとし、printでOUTに読み込んだテキストを出力。

$ vi Symbol.pl
$ ls
Symbol.pl  test.txt
$ cat test.txt
ABCDE
$ perl Symbol.pl
open success "test.txt".
$line = ABCDE
$ ls
Symbol.pl  output.txt  test.txt
$ cat output.txt
ABCDE$

確かに"output.txt"に書き込まれている。

Sample/perl/Symbol/Symbol/src/Symbol at master · bg1bgst333/Sample · GitHub

行入力演算子

ファイルハンドルを"<"と">"で囲むと、そのファイルの1行分の文字列を取得できる。
これを行入力演算子という。

行入力演算子「<>」 - ファイルから一行読み込む - Perl入門ゼミ

ファイルを開いたら、

こんな感じで最初の行を$lineに格納できる。

$ vi line_input_operator.pl
$ ls
line_input_operator.pl  test.txt
$ cat test.txt
ABCDE
$ perl line_input_operator.pl
open success "test.txt".
$line = ABCDE
$

ちゃんと読み込めてる。

Sample/perl/line_input_operator/line_input_operator/src/line_input_operator at master · bg1bgst333/Sample · GitHub