はじめまして(た)Perlさん その2

if制御構造

これは他の言語と同じ。
ただ、else ifはないのか?
「else if」 は「elsif」。ここだけ他と違うので注意。

bool値

trueとかfalseってないらしい。驚き!
undef、0、''、'0'はfalse。
それ以外はtrue
になる。
じゃあ、例えば、

print 'hoge' eq 'hoge';

とかやったら何が返るんだろう?trueとかfalseはないからな。

試したら、1が帰ってきた。じゃあ、falseの場合は0かと
思ったら何も返ってこなかった(空文字列?)

標準入力

標準入力を取得するには
をつかう。
が返す文字列には末尾に改行文字が入る。

chomp演算子

末尾改行を消すにはchomp演算子を使う。

$hoge = <STDIN>;
chomp($hoge);

よりも

chomp($hoge = <STDIN>);

としたほうがいい。

while制御構造

これは他の言語と同じ

未定義値

undefのこと。
JavaScriptのundefinedと同じ。

defined関数

undefなら偽。
それ以外なら真を返す。
ifの評価だとundefも''も偽になるから、undefかどうかの判定に使える。

リストと配列

他の言語とほとんど同じ。
スカラー変数と異なる名前空間に置かれる。
メモリがある限り長さに制限なし。

$hoge[0] = 'hoge0';
$hoge[3] = 'hoge3';

上記のようなことも可能。この場合2番目と3番目の要素は
undefになる。

最後の要素のインデックスは

$end_index = $#hoge;

のように$とperl識別子の間に#を入れる。
要素でなくインデックスがとれるので注意。

リストリテラル

(確か)scalaと同じ。[]でなく()でカンマ区切り。

範囲演算子

1〜5のリストを生成するときに使う。pythonのrange()関数と
同じようなことができる

(1..5)

のように".."で書く。

qwショートカット
('hoge', 'fuga', 'piyo');
qw/ hoge fuga piyo /;

上と下は同じ。クォート区切りせず簡単にリストがかける。
/の部分は実は文字記号なら何でもOK。

リスト代入

リストを変数に代入できる。

($a, $b, $c) = ("A", "B", "C");

右辺と左辺で要素の数が異なる場合は
変数(右辺)が多ければ、あまった変数はundefになるし、
少なければ(左辺の要素は)切り捨てられる。

とリストを書いてきたが、、、

実はリスト全体を表すのは配列名の前に@をつける。
スカラー変数はScalarで$、配列はArrayで@らしい。

$hoge[0] = "hoge0";
$hoge[1] = "hoge1";
$hoge[2] = "hoge2";
#↑ってのは↓とかける。
@hoge = qw/ hoge0 hoge1 hoge2 /;

配列を操作する演算子

pop,push,shift,unshift,reverse,sortなんかがある。
他の言語みたいに、

var ary = [0, 1, 2];
ary.push(3);

とかでなく。

@ary = (0, 1, 2);
push(@ary, 3);

と書く。上になれてるから変な感じはするけど。

文字列展開

スカラー変数同様、配列も文字列展開ができる。

foreach制御構造

foreach 制御変数 (配列){
処理
}

でループ処理が可能。
制御変数を省略すると「$_」ってデフォルト変数に値が入る。
デフォルト変数はforeachに限らずいろんなとこで使われる。

スカラーコンテキストとリストコンテキスト

これかなり重要。
「式は置かれる場所によって意味が変わる」
ぴんとこない。

@ary = qw/ "hoge piyo fuga /;
@ary = sort @ary; #リストコンテキスト:"hoge","piyo","fuga"
$num = 3 + @ary;  #スカラーコンテキスト: @aryは配列の個数3を返すので@numは6になる 

というように、@aryが場所によって異なる値を返すよってことらしい。
配列の長さ知るのにlengthとかないからおかしいと思ったらこういうことか。
リストを生成する式でスカラーコンテキストを扱ったり、逆もできるものがある。

$hoge = reverse qw/ e g o h /;#reverseはリストを返すけどこの場合はスカラー"hoge"を返す。
@piyo = "piyo";#スカラーでなく1つの要素("piyo")をもつリストを返す。