はじめに
初めまして!新卒エンジニアの肉@nikuzukiです。
Qiitaを書くのは初めてです。よろしくお願いいたします。
私はミクシィに入ってからPerlを書き始めた者です。
日々、Perlを書いていて楽しい!と思う一方で、
まだまだ手に馴染んでおらず、Perlに書かされている感じの新米エンジニアです。
そんな私は、Perlを書き始めてからつまづいたことをメモしておりまして、
そのメモを自分の復習を兼ねて、アドベントカレンダーの記事にしました。
内容として、
- つまづいたこと(を問題風にしたもの)
- 解説
という順で書き並べていきます。
また、これらのメモはPerlを理解していなかった私が生んだコードたちです。
ご勘弁ください。
True?False?
このなかで文字列が出力されるものはどれでしょうか?
print "yakiniku" if 0;
print "sushi" if 0.0;
print "sukiyaki" if "0";
print "shabushabu" if "0.0";
説明
Perlにはブール値がありません。
その代わりTrueやFalseを表す数値や文字列を使います。
0や'0'はFalseを表し、1や'0'以外の文字列はTrueを表します。
気をつけないといけないのは'0.0'で、一見Falseのように感じますが、
'0'以外の文字列でありTrueを表します。
怖いですね〜。
値、文字列 | T or F |
---|---|
0 | False |
1 | True |
''(空文字列) | False |
'0' | False |
'1' | True |
'0.0' | True |
このコードでは"shabushabu"のみが出力されます。
True?False? パート2
my $array = [];
if ($array) {
print "yes";
} else {
print "no";
}
説明
いきなり$や[]が出てきました。怖いですね。
Perlにはスカラー変数というものがあります。
スカラー変数は数値や文字列、メモリアドレスを入れることができる変数です。
my $変数名
で宣言することができます。
次にPerlのリストの話をします。
Perlは()でリストを作ることができます。
配列はmy @変数名
で宣言することができ、
1,2,3という要素が入った配列を作るときは
my @array = (1, 2, 3);
と書きます。
その一方で[]はリストが存在するメモリアドレスを表します。
my $array = [1, 2, 3];
は
1,2,3という要素が入っている配列が存在するメモリアドレスを$arrayに格納する
ということを表しています。
これをarrayref、配列のリファレンスと呼びます。
($arrayという変数命名は正確ではありませんね...ごめんなさい...)
1行目では$array
を宣言し、
空のリストが存在するメモリアドレスを$array
に渡しています。
ここで本題に入ります。
空のリストが存在するメモリアドレスはTrueでしょうか?Falseでしょうか?
Perlにおいてメモリアドレスは全てTrueです。
ここでは"yes"と出力されます。
リストとfor文
my @array1 = (1, 2, 3);
my @array2 = (4, 5, 6);
for (@array1, @array2) {
print $_;
}
説明
forをグルグル回すと何が出力されるでしょう?という問題です。
$_
という怖そうなものがありますが、これはデフォルト変数と呼ばれるもので
for文のスコープ内において、配列の各要素が渡される変数となります。
問題はarray1と2がどうなるかというものですが、
Perlでは配列が展開されて渡されます。
よって123456
と出力されます。
これは怖くないですね。
これがわかると
my @a = ();
my @b = (1);
map {
print "1";
} @a, @b;
も何が出力されるか分かりますね。
変わった代入
my @array = [0, 1];
print $array[0];
説明
ここまでの説明がわかるとピンとくるかもしれません。
これは0が出力されず0と1を持つリストがあるメモリアドレスが出力されます。
Perlでは配列にスカラ(メモリアドレス)を代入すると一つの要素を持つ配列となります。
それではここから0を取り出すにはどうするでしょうか?
Perlでリファレンスの要素を参照するにはアロー演算子->
を使います。
例えば、$arrayref = [1,2,3];
で2番目の要素を参照するには
$arrayref->[2];
と書きます。
今回の場合@array
の中にメモリアドレスがあり、その中の1番目を参照するので
$array[0]->[0];
と参照します。
()はリスト、[]はリファレンス
やや怖いですね。
終わりに
復習がてらに書き記したものなので、間違っている箇所があるかもしれません。
コメントでご指摘いただけると嬉しいです!
明日はらりょすさんです。
楽しみですね。