はじめまして(た)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かと
思ったら何も返ってこなかった(空文字列?)
標準入力
標準入力を取得するには
while制御構造
これは他の言語と同じ
未定義値
undefのこと。
JavaScriptのundefinedと同じ。
defined関数
undefなら偽。
それ以外なら真を返す。
ifの評価だとundefも''も偽になるから、undefかどうかの判定に使える。
リストと配列
他の言語とほとんど同じ。
スカラー変数と異なる名前空間に置かれる。
メモリがある限り長さに制限なし。
$hoge[0] = 'hoge0'; $hoge[3] = 'hoge3';
上記のようなことも可能。この場合2番目と3番目の要素は
undefになる。
最後の要素のインデックスは
$end_index = $#hoge;
のように$とperl識別子の間に#を入れる。
要素でなくインデックスがとれるので注意。
リストリテラル
(確か)scalaと同じ。[]でなく()でカンマ区切り。
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")をもつリストを返す。