- 会場について
- 飲食・喫煙・トイレ・・・
- 写真撮影について
- 写真撮影NGな方はお手数ですが、お申し出てください
- イントロダクション
- Scratchを使ってみよう
- 前回の復習
- 条件判断
- 繰り返し処理
- 変数を使う?
- Perlでプログラミングしてみよう
- 前回の復習
- 条件判断
- 真偽値
- if文
- 繰り返し
- for
- while
- foreach
- プログラミングの初心者を対象とした勉強会です
- 昨年まで開催していた「Perl入学式in沖縄」のスタッフを中心に、 今年から始めました
- 全5回で、受講料は一切かかりません!!!
- この勉強会では「プログラミング」を学ぶ上での基礎的な部分を全5回で行います
- ピヨグラミングを卒業すると、 他の言語の学習や、 作りたいものをプログラムで表現できやすくなります
- 「プログラミングそのものの入門として、プログラミングの考え方を身に着ける!」のがゴールです
- その為、特定の言語の機能などにフォーカスした話は極力しません
- webアプリケーションを作成する上での話も、 プログラミング自体の入門とは脱線していしまうので触れません
- もちろん皆さんの要望があれば開催します
- 恥ずかしい事は無いので、 ガンガン質問してください!!
- 皆さんから「xxxが勉強したい!!」や、 「ここがよくわからない」などが有れば、 柔軟に内容を変える予定です!
- この勉強会の完走後に、例えば「webプログラミングをしたいからPHPを学びたい!」と思い立った時に
- なんとなく基本構文がどういうのがあるか知っている
- どう構築すれば目的のプログラムが書けるか、少しイメージできる
- 入門書やサイトを見たときに、出てくる用語の7割くらいは見たことがある
- という状態になってもらえるのがゴールです
- その為、ピヨグラミングでは「皆さんに特定の言語を深く知ってもらう」様なカリキュラムは組んでいません
- もし、今回使うPerlに興味があればOkinawa.pmやYAPCなどのコミュニティ勉強会/カンファレンスに参加してみましょう
- Perlはあくまでプログラミングを学習する道具です。今回の勉強会ではこれを意識して構成していきます
- その為Perlの深い機能などについては、必要最低限の紹介しか行いません
- slackというチャットツールでの質問・相談・雑談などが便利です
- Perlに強いひとが多いですが、Perl以外の言語も大体触っている人が多いのでPHPの質問でも大丈夫です
- 機械学習はどうなんだろう…
- それ以外の沖縄の勉強会でもスタッフがいることが多いです
- Okinawa.rb
- Okinawa.pm
- tech美られでぃ
- ぎのわん勉強会
- なにか質問ありますか?
- 今回のサポーターの自己紹介です
- その後皆さんで
- 「名前(アカウント名など)」
- 「どうしてプログラミングを始めようと思ったか」
- 「やってみたいこと」
- を話して見ましょう!!
- 今日はプログラミングする上で重要な分岐とループといった制御構造を学びます!!!
- 説明するより手を動かしたほうが早いので、早速手を動かしてみましょう
猫を動かせるプログラミング言語
- ビジュアルプログラミング言語と呼ばれるものです
- プログラミングの考え方を楽しく学べます
- プログラミングの練習以外にも、ゲームやグリーティングカードの作成などもできます
- NHKで厚切りジェイソンが番組をしている
- 猫を左上から右端に移動させて、そのまま右下に移動させてみましょう
- ヒント:早すぎてよくわからないときは右上で一旦止めてみましょう
- ヒント: 「旗が押された時」を上におくと 便利そう
- 挙動不審な猫を作ろう
- 左右にキョロキョロ向きを変える猫を作ってみましょう
- できたら旗がクリックされたらずっとキョロキョロしていたらいいですね
- 挙動不審な猫を作ろう
- 左右にキョロキョロ向きを変える猫を作ってみましょう
- できたら旗がクリックされたらずっとキョロキョロしていたらいいですね
- 挙動不審な猫はビビりやすいです
- 4回振り向いたら泣いちゃう猫か
- スペースキーが押されるとびっくりして泣いちゃうような猫を作ってみましょう
- ひたすら猫が動き続ける作品を作ってみましょう
- もし画面の外に行きそうだったら画面の中に戻るようにしてみましょう
- 基本的にプログラムは「逐次処理」で実行されます
- 上から下に順番に実行されていきます
- Scratchだと各ブロックを連結するのが逐次処理に対応しています
- プログラムは主に「式や文」で構成されます
- 文をかいたらセミコロンをつけます
- Scratchでは「動き」や「見た目」などが文、「イベント」や「制御」が式に対応しています
- なにか質問があれば遠慮なくお願いします
- 機械(大体パソコン)にしてほしい命令を書くこと
- 機械は機械語(0と1の並び)しかわからないので、人間が普段使う英語や日本語で指示をすることができません
- 01に最終的に変換するけれど、人間がそこそこわかりやすい言語として「プログラミング言語」が開発されました
- プログラミング言語はたくさんあります
- C, Ruby, Perl, Python, PHP, Go, Haskell, Java, C++, Rust, なでしこ,....
- それぞれ「特性」や「主戦場」が異なります
- プログラミングを初めてするときは、1つの言語である程度まで勉強するのがオススメです
- 世界にたくさんあるプログラミング言語の1つ
- スクリプト言語、LL言語と呼ばれる中の1つです
- 「手続き型」言語ですが、オブジェクト指向などの機能があります
- あまり触れませんが…
- 今回はそこそこ手軽に使えるプログラミング言語なのでPerlを使っています
- 厳密にはPerl5のことをPerlと読んでいます
- マスコットはラクダやアルパカです
"
ダブルクォート(ダブルクォーテーション)- shift押しながら2で入力できます
'
シングルクォート(シングルクォーテーション)- shift押しながら7で入力できます
/
スラッシュ- スラッシュ(右下かな)でお願いします
\
バックスラッシュ- option押しながら円マークで入力可能です
;
セミコロン:
コロン,
カンマ.
ドット
- データをいかに整形して表現するか、というところがあるのでデータを表現しやすくする機能があります
- データの例
- 計算結果
- 人の個人情報
- Twitterのツイート, fav, RT, フォロー...
- これらのデータは主に 「変数」と呼ばれる箱に保存します
- Perlでは変数は実は3種類ありますが、今回は「スカラ変数」と呼ばれるものを使います
- 一般的なプログラムの変数です。
- Perlでは
$変数名
で使います- scalar の
$
らしいです[要出典]
- scalar の
- Perlでは変数の宣言(最初に使う時)に
my
と書きます- 他の言語では特別宣言の構文がない場合もあります
my $hoge;
- プログラミングでは変数の代入に
=
を使います- 一般的な数学とは意味がことなり「右辺値を左辺に代入する」という意味です
- 宣言と代入は両方一緒にするのがオススメです
my $hoge = "hello!"
$hoge = "heyheyhey";
- Perlでは文字列を
"
か'
のどちらかで囲みます- 文字列とは、プログラミング中でデータとして使う、2文字以上の文字の並びのことを指します
- プログラミング言語によっては「文字1文字」と「2文字以上の文字」で扱いが異なる為です
- クォーテーションによってそれぞれ意味が異なります
'
- 変数や制御文字が展開されず、文字として使われます
"
- 変数や制御文字が展開されます
- Perlではprint文で文字を出力することが可能です
- 最後に改行を表す制御文字
\n
をいれるのを忘れずに!
- 変数
$msg
を宣言し、なにか文を代入してみましょう - 次の2通りのprintの仕方でどう表示が変わるか見てみましょう
print '$msg\n';
print "$msg\n";
- Perlは歴史的に自由な文法なので、かなりいろいろな書き方ができます
- バグを生みやすい書き方もできてしまうので、あえてPerlに「ちゃんと書きますよ」と教えるのが最近の流行です
use strict;
use warnings;
- プログラムの先頭にプラグマと呼ばれるこの2行を書くことで、現代的に書くという宣言ができます
- バグの早期発見に役立つので、これからのプログラムはこれを使いましょう
- 2行をいれないでバグを発見してみましょう
$hoge = "hgello";
print "$hoge\n";
- 基本的に次のようなコードを書くことが多いです
my $number = 10;
$number = $number + 90;
my $str = "hello";
$str = $str . " world!";
- あまりにも自分に代入する処理が多いので、こういうふうに書くことができます
my $number = 10;
$number += 10;
my $str = "hello";
$str .= " world!";
- また、1を足したり引いたりするのが多いので、こういう書き方もできます
my $number = 10;
$number++;
これは、これと意味が同じです
my $number = 10;
$number = $number + 1;
- 1を足すことをインクリメント, 1を引くことをデクリメントと呼びます
++
の記号は前に置くことも可能ですが、いろいろと意味が異なる使い方もできます- その為、インクリメントはそれだけで分離し、基本後ろに
++
を書くのが良いとされます
- その為、インクリメントはそれだけで分離し、基本後ろに
- 代入を使って
$number
にまず0を代入します - 次に1を加えて
- 次に10をかけて
- 最後に100で割りましょう
- 0.1になれば正解!!!
- なにか質問ありますか?
- まず Scratchの「もし〜なら」に対応する条件分岐を見ていきます
- Scratchではどのようなときに使いましたか?
- プログラムでは主に「if文」というもので条件を判断させ、分岐させます
()
の中に真偽値をいれることで動きが変化します- このことを「条件分岐」と呼びます
- scratchの「でなければ」は
else
が相当します
- 「真(成り立っている)」か「偽(成り立たない)」の2つの状態を持つデータ構造のことです
- 言語によってはbool型, boolean型としてサポートしているものがあります
- まとめて「真偽値」「論理値」と呼ばれます
- Perlでは「空白文字」「0」が偽として扱われます
- それ以外は今の所真です
- 真のことをtrue, 偽のことをfalseと呼ぶことが多いです
- ifの
()
の中に数値をいれてみて、どのような動きをするか確かめてみよう
if ( ){
print "true!!!!!!!\n";
}
print "if statement fin\n";
- ifの
()
の中に数値をいれてみて、どのような動きをするか確かめてみよう
if ( ){
print "true!!!!!!!\n";
} else {
print "false!!!\n";
}
print "if statement fin\n";
- trueやfalseを作成する演算子のことを論理演算子と呼びます
- 2つの数が同じかどうかなどは、これらを使います
!
はプログラムミングで先頭についた場合、否定を意味するのが多いです
== # 右辺と左辺が等しいならば「真」
!= # 右辺と左辺が等しくないならば「真」
< # 右辺より左辺が小さいならば「真」
> # 右辺より左辺が大きいならば「真」
<= # 右辺が左辺以上ならば「真」
>= # 右辺が左辺以下ならば「真」
- if文と組み合わせて使う事が多いです
- これはif文が真偽値を読み取り条件分岐をする文であるからです
- 他に真偽値を読み取る機能がある文や関数(今日はしません)を使うケースもあります
if ($narutal_number > 0 ){
...
}
- お題にそってプログラムを直してみましょう
$left
が$right
よりも小さかったらプリントする
my $left = 10;
my $right = 20;
if ($left ???? $right ){
print "$left is smaller than $right!\n";
}
$number
が0じゃなかったらprintする
my $number = 20;
if ($number ???????){
print "$number is not 0!\n";
}
$left
が$right
以上なら$left is greater than or equal to $right!\n
を出力
$left
が$right
より小さいなら$left is smaller than $right!\n
を出力
my $left = 10;
my $right = 20;
???
eq # equal
ne # not equal
gt # greater than
ge # greater equal
lt # less than
le # less equal
- Perlでは,文字列を比較する場合は
eq
やne
といった単語を用いた比較演算子を使います - 「文字列の大小」とは, 文字列の長さではありません
- 辞書順に並べた時に前にくるものが小さく, 後ろにくるものが大きいという意味です
- 他の言語では文字列用の演算子を用意していないケースが多いです
- Perlなどの言語では複数の論理式を「または」と「かつ」で繋げる事が可能です
- 「または」は どちらかが真であればtrue
- 「かつ」は両方が真であればtrueとなります
my $number = 10;
if ( $number != 0 && $number %2 == 0){}
if ( $number != 0 || $number %2 == 0){}
-
四則演算以外の演算子として
%
があります%
はあまりを計算します
-
次のプログラムを動かしてみましょう
print 4%2, "\n";
print 4%3, "\n";
- このif文の条件式を変えて 「 10以上で偶数ならevenと出力する」ようにしてみましょう
my $number = 10;
if (???){
print "even!!\n";
}
- Scratchの「ずっと」や「あいだじゅう」に対応する処理を「ループ処理」といいます
- 日本語的には「繰り返し処理」「反復処理」ですね!
- Scratchでは猫を「ずっと」動かす時などに使いました
- プログラミングでも、「ずっと」同じ処理をしたい場合や、「ある回数」同じ処理をしたい時、「それになるまで」処理をしたい時に使います
- Scratchで猫を動かすのと考え方は同じですよね!
- もし、ループ処理がないと、例えば「同じ処理を100回したい!」となった時に、100回同じコードを書く必要があります
- 流石に辛いですよね...!
- またプログラムでよく使われる「集合(配列など)」に対して同じ処理をしたい時にも使います
- この使い方は後で説明します
- プログラミング言語の大体には大きく2つのループ処理が実装されています
- 他のループ方法も言語によってはありますが、今回は基本を勉強します
-
for
- 指定した回数を繰り返すことができる
- 集めた要素(集合に対して繰り返す)
-
while
- ある条件を満たしている間、繰り返す
-
回数が決まっている。ある集合に対して同じことをしたい
- forを使おう!!
-
ある一定条件でループさせたい
- whileを使おう!!!
-
基本的にはこの考え方ですが、強制はないので、好きな方で書きましょう
- 両方互換性があるので、どちらの書き方でも可能です
-
そもそもこれらを使わないという手もあります(今回は触れません)
- PerlやC, Javaでのfor文は主に次の構造になっています
for (カウンタ変数の初期化 ; ループの継続条件; 更新)
for (my $i = 0; $i < 10 ; $i++){
}
- 複数の文(statement)の集合のことをブロックといいます
- 日本語で言うところの段落に近い概念です
- PerlやC言語では
{
}
で囲まれている部分がブロックとなります- 他の言語では、 インデント(字下げ) や
begin
end
などで囲むケースがあります
- 他の言語では、 インデント(字下げ) や
- for文やwhile文では、ループ中に実行する処理をブロックで表現します
- forループは次の手順で実行されます
- カウンタ変数の初期化などの初期化を実行する (;区切りの一番左)
- 条件を評価(確認する) falseならループを抜ける
- ブロックの処理を実行
- 更新をする
- また条件評価(2に戻る)
for (カウンタ変数の初期化 ; ループの継続条件; 更新)
for (my $i = 0; $i < 10 ; $i++){
}
- 次のコードを実行して動きを確かめてみよう
- カウンタ変数が
$i
なのは indexの略で、慣例的にループのちょっとしたカウンタ変数ではiを使います
use strict;
use warnings;
for (my $i = 0; $i < 10 ; $i++){
print "$i\n";
}
- 実はローカル変数と呼ばれる変数(perlではmyを使って宣言した変数)は使える範囲が決められています
- その範囲のことを「スコープ」「変数のスコープ」などといいます
- 通常は
{
}
で囲まれている「ブロック」の中にスコープが限定されます
for (my $i = 0; $i < 10 ; $i++){
print "$i\n";
}
- このfor文では, 変数
$i
のスコープはfor文のブロックの中に限定されるので、外からは使えません
- 実行するとどうなるでしょうか
use strict;
use warnings;
for (my $i = 0; $i < 10 ; $i++){
print "$i\n";
}
print "$i\n";
- 1から10までfor文で文字を出力してみましょう
- 次は同じ文字を5回for文で出力してみましょう
- すでにお気づきかもしれませんが、先程のループのプログラムには、行頭に謎の空白がある行があります
for (my $i = 0; $i < 10 ; $i++){
print "$i\n";
print "hello\n";
}
- 上の例では2,3行目に謎の空白が行頭にあります
- この行の様に、行頭に空白をいれることを「インデント」、「インデントする」と呼びます
- インデントは日本語では「字下げ」と呼びます
- インデントは、プログラムではただの空白なので、特に意味を持ちません
- では、なぜインデントをするのでしょうか
- これは、先程のブロックと関連しています
for my $i (1..10){
print "numbers is $i\n";
print "hello\n";
}
print "finish loop!\n";
- 例えば、 上のコードの場合、どこからどこまでが、for文でループの度に実行されるのか
{
と}
を注意深く探さないといけません
for my $i (1..10){
if ($i % 2 == 0){
print "this is even\n";
}else{
print "numbers is $i\n";
print "hello\n";
}
}
print "finish loop!\n";
- さらに中にif文をいれると、「あれ...どこからどこまでがif文の範囲...?」みたいになってしまいます
for my $i (1..10){
if ($i % 2 == 0){
if ($i == 2){
print "this is even and i = 2!!\n";
}else{
print "this is even\n";
}
}else{
print "numbers is $i\n";
print "hello\n";
}
}
print "finish loop!\n";
- if文の中にif文をいれるともはやなんだかわかりません... 😇
- インデントは、半角スペースかtab文字が良いとされています
- 最近のプログラマの間では、半角スペースがよく利用されています
- インデントでいれる半角スペースの長さは言語によって推奨されているものがある場合があります
- 他にはプロジェクトベースで指定されています
- また、半角スペースではなくタブが推奨されているのもあります...(ややこしいですね)
- Perlでは、「4つの半角スペース」をインデントスタイルとして利用するケースが多いです
- 他の言語では「2つの半角スペース」もしくは「4つの半角スペース」が多いです
- インデントは、自分がプログラミングする上で、理解の助けになるのでつける癖をつけましょう
- 今回は半角スペース2つ分のインデントを付けていきましょう
for my $i (1..10) {
if ($i % 2 == 0) {
if ($i == 2) {
print "this is even and i = 2!!\n";
} else {
print "this is even\n";
}
} else {
print "numbers is $i\n";
print "hello\n";
}
}
print "finish loop!\n";
- 今みなさんと書いてみたfor文やC言語などで使われているfor文です
- 最近のPerlや他の言語では、拡張for文、foreachと呼ばれるfor文が主に使われています
- これは、集合と呼ばれるデータの集まりに対してループする。というものです。
('apple','banana','orrange',500);
- このような
()
の中にカンマ区切りで並べられているデータ構造を「リスト」と呼びます - 次回学習予定の「配列」に代入して使う事が多いです
- リストは順序が決められており、この場合は最初が
apple
です - リストなどの集合に作用するfor文などを「イテレーター」という呼び方をすることがあります
- ループのたびに、集合から1つ1つ文字列を取り出し、 変数
$animal
に代入します - その代入した変数を使って、ブロックの中の処理を実行します
- ブロックが終わったら次の値を取り出します
- それを値がなくなるまで繰り返します
print "start loop!\n";
print "-------\n";
for my $animal ('cat', 'dog', 'bird', 'penguin'){
print "Hello $animal!\n";
print "Bye. $animal!\n";
print "-------\n";
}
print "end loop---!\n";
print "start loop!\n";
print "-------\n";
for my $animal ('cat', 'dog', 'bird', 'penguin'){
print "Hello $animal!\n";
print "Bye. $animal!\n";
print "-------\n";
}
print "end loop---!\n";
- このプログラムでは
('cat', 'dog', 'bird', 'penguin')
という 文字列の集合をループに利用します - 集合を作るには、 変数や文字列、数値といったデータ構造を、カンマ
,
で区切りながら、並べます
- このプログラムをコピペして動かしてみましょう
use strict;
use warnings;
print "start loop!\n";
print "-------\n";
for my $animal ('cat', 'dog', 'bird', 'penguin'){
print "Hello $animal!\n";
print "Bye. $animal!\n";
print "-------\n";
}
print "end loop---!\n";
-
Perlでは
'数字'..'数字'
と書くことで、 その数値の範囲の集合を作ることができます -
↓のプログラムを実行して見ましょう!
print 1..10;
print "\n";
- Perlを使って 1から20までの数値の集合を作りましょう
..
と組み合わせると、指定した回数を繰り返すことができます- ループのたびに、集合から1つ1つ数字を取り出し、 変数
$i
に代入します - その代入した変数を使って、ブロックの中の処理を実行します
- ブロックが終わったら次の値を取り出します
- それを値がなくなるまで繰り返します
- ループのたびに、集合から1つ1つ数字を取り出し、 変数
for my $i (1..10){
print "numbers is $i\n";
}
$i
とは、index(索引)の略で、こういったループ処理や配列の操作(次回以降に学びます)でよく使われます- 集合の中の1要素を取るときに、数値を
$i
に設定することが慣習的に多いです
-
- -10から10までの集合を作ってみましょう
- それをfor文で出力してみましょう
-
- 10回「Hello!!!」と叫ぶなぞのプログラムを書いてみましょう
- 今まではforを使って書いてみました
- もう一つのループ構造であるwhileを見てみましょう
- while文では条件が満たされている間の分動き続けます
my $counter = 10;
while ( $counter != 0) {
}
- ファイルやデータの集合が「まだある間」動かすのによく使います
while (my $fruit = <DATA>){
print "$fruit\n";
}
__DATA__
apple
banana
mango
- DATAブロックになにかをおいてwhileで見てみましょう
- 皆さん何かやりたいのありますか?