LoginSignup
5
0

More than 3 years have passed since last update.

新卒でPerlを書き始めてつまづいたことを並べます。

Last updated at Posted at 2019-12-18

はじめに

初めまして!新卒エンジニアの肉@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];と参照します。

()はリスト、[]はリファレンス
やや怖いですね。

終わりに

復習がてらに書き記したものなので、間違っている箇所があるかもしれません。
コメントでご指摘いただけると嬉しいです!

明日はらりょすさんです。
楽しみですね。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0