13章 関数を使ってみよう!

今回は、「関数」というものを学びます。「かんすう」と呼びます。

関数とは、

  • まとまった処理をしてくれる
  • なにかを渡すと、なにかをしてくれる

といったような機能をもっています。

今回は、「まとまった処理をしてくれる」というのを見ていきたいと思います。

「まとまった処理」といってもいろいろあります。


今回は、ロボットになにかやらせることを考えましょう。
ロボットにプログラムして人間のかわりに用事をすませてもらえれば、とても便利になります。


それでは、ロボットに買い物にいってもらいましょう。

use strict;

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";


これを実行すると、

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く

こんな感じです。いつか本当にロボットを動かせる日を夢見て、いまはこれで我慢しましょう(残念すぎる)。



それでは、
次の日になったとして、同じものを買ってきてもらいましょう。


プログラムにするとこんな感じです。

use strict;

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";

print "\n";
print "-- 次の日 --\n";
print "\n";

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";

実行すると、

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く

-- 次の日 --

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く

こうなります。



そしてまた、次の日も、同じものを買ってきてほしくなりました。

プログラムにすると....

use strict;

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";

print "\n";
print "-- 次の日 --\n";
print "\n";

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";


print "\n";
print "-- さらに、次の日 --\n";
print "\n";

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";


うわわわわ。なんだか とっても大変なことに!!!!!


ここで、関数! 関数を使いましょう!!
関数ができるのは「まとまった処理」ですよ〜〜〜



そう! まとまった処理!

print "家から出る\n";
print "道を歩く\n";
print "ショップに着く\n";
print "みかんを買う\n";
print "りんごを買う\n";
print "ショップから出る\n";
print "道を歩く\n";
print "家に着く\n";

ここの部分ですね。ここが何回もでてきている!


ここをまとめて、ひとかたまりにして、
ロボットに「買ってきて〜」とこれだけお願いすれば、買ってきてもらえるようにしたい!!


さて、この関数なんですが、関数にも変数と同じように、名前をつけてあげなければいけません。
buy という名前にしましょう。英語で「買う」の意味です。

そうすると、こうなります。

sub buy{
  print "家から出る\n";
  print "道を歩く\n";
  print "ショップに着く\n";
  print "みかんを買う\n";
  print "りんごを買う\n";
  print "ショップから出る\n";
  print "道を歩く\n";
  print "家に着く\n";
}

これで、まとまった処理の完成です。これで「買ってきて〜」とお願いするときは、
プログラムでは、

buy();

と書けばいいことになりました! とってもラクチン!

ということで、次の日も、その次の日も同じものを買ってきてもらうようにするには、次のようにできますよ〜

use strict;

sub buy{
  print "家から出る\n";
  print "道を歩く\n";
  print "ショップに着く\n";
  print "みかんを買う\n";
  print "りんごを買う\n";
  print "ショップから出る\n";
  print "道を歩く\n";
  print "家に着く\n";
}

buy();        # 関数を使った!

print "\n";
print "-- 次の日 --\n";
print "\n";

buy();        # 同じ関数を使う!

print "\n";
print "-- さらに、次の日 --\n";
print "\n";

buy();        # さらに同じ関数を使う!


実行してみましょう。

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く

-- 次の日 --

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く

-- さらに、次の日 --

家から出る
道を歩く
ショップに着く
みかんを買う
りんごを買う
ショップから出る
道を歩く
家に着く


やった〜 大成功!! もう同じことを何回も書かなくていいようになりました。
これが関数の、「まとまった処理をしてくれる」パワーです。


このように、なんかうっとうしい、自分ひつこいような気がすると思ったときに「関数」は使えますよ〜
ぜひ使っていけるようにしましょう。


さあ、

この書き方をしっかり覚えてくださいね〜 それでは、また〜

12章 コンテキスト

さあ、今回は、「コンテキスト」の話をします。


コンテキストとは、なんでしょうか?

つぎのような日本語を、まず考えてみることにしましょう。

1 はしで食べる。
2 はしを渡る。

1の方の、「はし」は、「箸」ですね。 2の方は、「橋」です。


こんな感じで、前後の関係つまり、文脈から、単語の意味を推測することができます。
「コンテキスト」とは「文脈」のことです。このように、文脈から判断して、Perlが挙動を変えるといったことをしてくれるのです。それが「コンテキスト」です。



それでは、Perlのコンテキストを紹介します。
ここでは、「スカラーコンテキスト」と「リストコンテキスト」というもの紹介します。


配列まで学んだ皆さんなら、きっと理解できるはずですよ。
コンテキストの意味は説明しましたので、「スカラー」と「リスト」の説明をしたいと思います。
スカラー」とは、「ただひとつ」という意味です。それに対して、「リスト」とは「たくさん」といった意味合いです。



今まで、「箱」のイメージだった、 $x など、$で始まっているものこれは、たった1つの値しか入れれませんでした、ですから、「スカラー変数」と呼ばれます。それに対して、「タンス」のイメージの配列は、複数つまりたくさんの値を入れれますね。ただ、配列は、リスト変数とは呼ばれません。

さて、配列は、

my @array = (1,'a','b', 2);

こんな感じで値を代入できました。

スカラー変数なら、

my $x = 1;

こんな感じです。
では、

my $x = (1, 'a', 'b', 2);

とすると$xには何が入るでしょうか?
最後に書かれている値である「2」が入ります。
$xはスカラーですから、「1つ」しか入れることができません。このときPerlは、最後に書かれた値を代入します。
このような文が「スカラーコンテキスト」です。

では、もう一度、

my @array = (1,'a','b', 2);

を考えてみましょう。 @arrayには、 1, 'a', 'b', 2という4つの値が入ります。「たくさん」の値を代入することができました。ですから、この文は「リストコンテキスト」なのです。

では、

my ($x, $y) = ('a', 'b');

とするとどうでしょうか? $xには、'a'が、 $yには、'b'が代入されます。これは、ひとつずつは、スカラー変数ですが、たくさんの値を扱うことができましたので、「リストコンテキスト」です。


さて、この「コンテキスト」というのは何がすごいのでしょうか?
このすごさを味わっていきたいと思います。
つぎの、プログラムを実行してみてください。$xには何が入っていますか?

my @array = (1,2,'c');
my $x     = @array;
print "$x\n";

実行すると3と表示されましたね。 そうなんです、$xには3という値が入ったのです。
3は、@arrayの「大きさ」です。 おっと、配列の「大きさ」という言葉を説明して置かねばなりません。配列の「大きさ」とは、配列に何個の値(要素)が入っているかという事です。@arrayには今、3つの値が入っているので「大きさ」は3となります。



つまり、配列を、「スカラーコンテキスト」で評価した場合は、配列は「大きさ」を教えてくるのです(「返す」と言う)。また、「大きさ」のことを「長さ」と呼んだりもします。

つぎのように、@other_arrayに代入しているところは、「リストコンテキスト」です。

my @array       = (1,2,'c');
my @other_array = @array;

「リストコンテキスト」ですので、@other_arrayには、@arrayの中身がコピーされるだけです。

for(@other_array){
  print "$_\n";
}

で、中身を表示させてみてください。


このように、Perlは、「コンテキスト」によって、挙動を変えるのです(変数の見方を変えたりなどする)。



じつは、forの配列を与えている部分も、「リストコンテキスト」なのです。


「リストコンテキスト」ですから、複数の値を扱えます。

my ($x, $y, $z) = (1, 'b', 3);  # リストコンテキストで代入

for($x, $y, $z){
  print "$_\n";
}

これは、つぎのように表示されます。

1
b
3

forの配列を与えるところには、このように複数の値を与えることが可能なのです。

あっと、

# リストコンテキスト

の部分が気になりますね。これは、「コメント」といって # より後ろに書かれた部分をPerlは無視をします。
このように、プログラム中に説明書きをいれたいときに「コメント」はよく使われます。



今回は、「コンテキスト」というモノを学びました。これを使いこなせるとかなり強力になりますので、ぜひマスターしていってください。あわせて、「コメント」というものも最後に学びました〜。


おっと、ここで前回のお話にもどりましょう。
前回なぜ、$kyoushitu[0]と@ではなく$を使ったのでしょうか?

もうお分かりですね。配列それ自体は複数の値(要素)を持っていますが、そのひとつずつを扱いたい場合は、「たったひとつ」つまり、「スカラー」であることを示すために、$にしなければいけないのです。
スカラー」は英語で、「scalar」と書きます。$は、「S」に見えませんか? scalarの頭文字のSから、スカラーを示すために$が使われたのです。

11章 配列を使う

さっそく配列に値を代入する方法を紹介したいと思います。

my @kyoushitu = ('田中', '中西', '木村');

こんな感じで、代入するほうを()で囲う必要があります。

配列は、タンスのイメージであるとお伝えしましたが、
このタンスは伸縮自在です。段を勝手に増やしたり、減らしたり、用意したりしてくれます。
今回は、3つの値を代入したので、3段のタンスが用意されました。


では、代入された値を取り出す方法を見てみましょう。

print "$kyoushitu[0]\n";
print "$kyoushitu[1]\n";
print "$kyoushitu[2]\n";

@kyoushituの@が$に変わっていることに注意してください。
これは、「コンテキスト」という考え方を紹介したときにすんなり理解できると思いますので、
今回は、$に変わるということを覚えておきましょう。


[数字]のところが気になると思いますが、配列というのは、0から始まる番号をもっています。
絵にするとこんな感じです。




さて、配列なのですが、「繰り返し」と呼ばれる処理と非常に相性がよいです。
配列というのは、たくさんの値をもっていますよね。その配列すべてに対して処理を行いときに「繰り返し」と呼ばれる処理を使います。
今回は、「for」というものを紹介します。英語で「for」は「〜の間」という意味です。では、なんの間なのでしょうか?
そうです、「まだ処理していない配列がある間」ということです。

実際に使い方を見てみましょう。

my @kyoushitu = ('田中', '中西', '木村');

for(@kyoushitu){
  print "$_\n";
}

これで、配列の中の値を全部、画面に表示することができました。
$_というのは、Perlにおいて色々な局面で使われるのですが、forの中ででてきたときは、
「配列の各要素それ自体」となります。

先ほどのforの中は、配列の中身のぶんだけ繰り替えされることになります。
はじめてforの中が処理される(1回目)のときは、 $_ は、'田中' になります。
2回目は、'中西', 3回目は、'木村' です。
'木村'を処理した時点で、もう処理していない配列はありませんので、forの処理が終わります。


今回は、「配列に代入する方法」と「繰り返し」について学びました。
繰り返しは、「for」以外にもたくさん、くりかえす方法がありますので、これだけで満足せずガシガシご自身で勉強なさっていただきたいと思います。(forの書き方も、これ以外にあります)
また、 $_ は、いろいろな場面で用いられることから、どういうときにどんな働きをするのかひとつずつ学んでいかなければならないのですが、使いこなせると大変便利です。
(※ただ、$_は読み辛くなるので、使うタイミングには注意が必要です..... といっても知識がないと、そのタイミングを判断できないのですが....)


次回は、「コンテキスト」というものを扱いたいと思います。

10章 配列というものを知る

今回は、「配列」というものを学びます。これは「はいれつ」と読みます。

今まで、変数を1つずつ、

my $x = 1;
my $y = 2;
my $z = 3;

といった感じで使ってきましたが、この変数をひとつの「まとまり」として扱った方が便利なときがあります。
たとえば、変数に、教室にいる人の名前をいれて人数分の変数を扱うよりも、まとめて扱ったほうが便利です。そんなことを可能にしてくれるのが「配列」なのです。


上の図のように、 $tanaka, $nakanishi, $kimura というように個別に変数を用意するのではなく、ひとつの配列でまとめて扱ってしまいます。


このような、「まとめて扱う仕組み」を持った変数(つまり配列)は、頭に@を付けます。「@」は「アットマーク」と呼ばれる記号です。なぜ、アットマークを付けるのかというと、「配列」は英語で「array」というのですが、この頭文字が「a」なので、aを丸でかこった、「アットマーク」が使われるのです。


今まで、変数は、「箱」のイメージでしたが、配列は、「タンス」のようなイメージです。箱には、ひとつしか入れれませんでしたが、ひとつしかモノを入れれない引き出しをたくさんもった「タンス」それが、配列です。 



ここで、変数というものの理解を一歩深めねばならないのですが、変数には、「箱」のイメージのものと、実は「タンス」のイメージのモノ、2つがあったのです(実は、もう一種類ありますが、それは後のお楽しみということで)。


今回は、「配列」というものがあるということを学習しました。

次回は、「配列」に値を代入する方法や、代入したものを使う方法を紹介します。

配列は、はじめて習うときは、むずかしいなと感じるかもしれませんが、プログラムの幅がぐぐっと広がりますし、
プログラムを書いていると必ずこの機能が欲しいときがでてきますので、頑張っていきましょう。

9章 ¥n (改行)

今回は、 \n という不思議なものを習いましょう。



ちょっと次のプログラムを実行してみてください。

print 'aaa';
print 'bbb';
print 'ccc';
aaabbbccc

と、くっついて表示されてしまいました。
でも、

aaa
bbb
ccc

と表示してほしいですね。 それを行ってくれるのが、「\n」です。
「\」と「n」の2文字で、ひとつの意味を持っています。「改行」という意味です。

では、\n を付け加えてみましょう。

print 'aaa\n';
print 'bbb\n';
print 'ccc\n';

あら、

aaa\nbbb\nccc\n

と表示されてしまいました。
実は、 文字を、'(シングルクォート)で囲むのではなく、次のように"(ダブルクォート)で囲ってやらなければなりません。

print "aaa\n";
print "bbb\n";
print "ccc\n";


これで、つぎのようにうまく改行されて表示されます。

aaa
bbb
ccc

Perlでは、'(シングルクォート)と、"(ダブルクォート)では意味・機能がちがっているのです。

今回は、「\n」とシングルクォートとダブルクォートでは意味・機能が違うということを学びました。
「\n」は便利ですので、積極的に以降使っていきます。

8章 もっとifを使う

前回は、「if」を学びました。ただし扱ったのは、文字列だけでしたね。
今回も引き続き、多くのことを学びます。プログラムの幅がもっとぐぐっと広がりますよ。


では、数字をつかって「if」を見ていきましょう。
変数に入っている内容が100のとき、「おめでとう100番です」と表示してみましょう。

use strict;
my $x = 100;

if( $x == 100 ){
  print 'おめでとう100番です';
}

こんな風に数字が、「等しい」を表すには、「==」とイコールを2つ書きます。これもやはり真ん中に置く演算子です。

さて、ここで100以外のときには、「残念100番ではありません」と表示したいとします。
そんなときは、「else」の出番です!これは、数字を扱うときだけではなく文字列を扱う場合でも使えますよ。
ifの( )の中身が思っているものと違うときには「else」の方が処理されます。
こんな感じです。


今回は、「判断」という言葉を用いず、「条件」という言葉に変えてみました。実は、プログラムの世界では、「条件」という言葉がよく使われます。 $x == 100 は、 「$xが100に等しいとき条件が成り立つ」 という言い方をします。また、「$xが100でないとき条件が成り立たない」という言い方をします。

またまた、うそっこプログラムで、イメージをつかんでください。

if ( おなかがすいた ){
  ごはんをお持ちしました。
}else{
  肩をおもみします。
}
if ( 蛍光灯のスイッチON ){
  蛍光灯の明かりがつく
}else{
  蛍光灯を押したら明るくなりますよ〜 と知らせる
}
if ( 弾が機体にあたる ){
  機体爆発
} else {
  スコアをUPする
}

では、雰囲気をつかんだところで、本当のプログラムを見てみましょう。

use strict;
my $x = 99;

if( $x == 100 ){
  print 'おめでとう100番です';
}else{
  print '残念100番ではありません';
}

$xに入れる内容をいろいろ変えたり「条件」の内容をいろいろ変えたりして試してみてください。



今回は、「数字の扱い方」と「条件」という言葉、さらに「else」の3つを学びました。
頑張ってモノにしていってください。

7章 コンピュータに判断させる

今回は、コンピュータに色々判断させる方法を紹介します。

世の中には、判断にせまられる状況ばかり。


洗濯物は乾いたあとじゃないと取り込めないし(僕はいつでも部屋干しですが)。
会社についたら自分の席にすわるし(誰かの席に座ったら大変だ)。
電源を入れて、コンピュータの画面がログイン画面になってからユーザー名とパスワードを入力するし(電源が立ち上がっていなかったらキーボードを打っても悲しいだけだ)。


こんな風に毎日色んな場面で状況を判断してからなにか行動を起こしています。


これをコンピュータ(プログラム)の場合で考えてみると、


シューティングゲームで、弾が機体にあたったら機体を爆発させる。
将棋のゲームで、駒を動かしたい先に移動できるなら、駒を動かす。
などがあります。


車の自動運転なんかでは、白線を感知して状況を判断し、勝手にハンドルをきってくれます。

どんどん科学が進めば、ロボットにプログラムを組み込んで、おなかがすいたら、勝ってに判断して、ごはんを運んできてくれるようになるかもしれません。夢は広がるばかりです。



さあ、この「判断」を実現するのが「if」です! 「if」を紹介しましょう。

でも、ちょっと待ってください。僕らはここまで数字を扱ってきました。数字にはちょっと飽きてきたところではないでしょうか?

文字!文字列!を扱いましょう!プログラムでは、文字も扱えます。変数に、ユーザー名を入れて、ユーザーによって処理を分けたら楽しくありませんか?

bingo_nakanishiというユーザ名なら、このブログを更新できるとか! おお!なんかWebアプリケーションが作れそうな気がしてきたぁああああああ!

は、しまった興奮してしまいました。
とまあ、こんな風に、「判断」できることによって、プログラムの幅がぐぐっと広がります。


さあ、プログラムを書いてみましょう

use strict;
my $user = 'bingo_nakanishi';

if($user eq 'bingo_nakanishi'){
  print 'ブログを更新できます';
}

ブログを更新できます
と表示されれば大成功です。

「ああー if も学ばなきゃいけないのに、 eq とか新しいのも出てきた〜」
本当に覚えることが多いですが、ゆっくりいきますね。

今まで、変数には、数字しか代入していませんでしたが、こんな風に文字列も代入できます。


あ、文字列の「列」というのが気になるかもしれませんが、これは複数文字で出来上がっているという感覚で今のところOKです。'bingo_nakanishi'は、複数の文字で出来上がっていますよね(15文字)。

さあ、ifのところです。仕組みは次のようになっています。

わかりにくいので、うそっこプログラムで、雰囲気をつかんでもらいましょう。

if ( おなかがすいた ){
  ごはんをお持ちしました。
}
if ( 蛍光灯のスイッチON ){
  蛍光灯の明かりがつく
}
if ( 弾が機体にあたる ){
  機体爆発
}


こいう風に書く決まりなんです。プログラムというのは、文字を理解してコンピュータが「なにかを起こしてくれる」わけです。コンピュータはこういう風に書いてもらえると「判断」ができるわけですね。


さてさて、本当のプログラム

use strict;
my $user = 'bingo_nakanishi';

if($user eq 'bingo_nakanishi'){
  print 'ブログを更新できます';
}

に戻りましょう。 「eq」の説明です。
「eq」 は、 「+」 とかと同じ演算子なんです(真ん中に置く、中間演算子ですね)。 左と右が同じ文字列なら「同じですよ〜」という結果を返してくれます。これを if の ( ) の部分が受け取れば、 { } で囲まれた部分を処理してくれるのです。




試しに、 'other_nakanishi' というのを、$user変数に代入してみましょう。

use strict;
my $user = 'other_nakanishi';

if($user eq 'bingo_nakanishi'){
  print 'ブログを更新できます';
}

なにも表示されなくなれば大成功です。
こんな風に、ifを使えば、いろいろな場合によって処理を変えることができます。わくわくしてきますね。


今回は、文字列を扱いましたので、次回は、また数字をつかって「if」を見ていきましょう。