class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第2回 <div class=footnote> <small> Copyright 2019,2022 (C) Ken'ichi Fukamachi (<A HREF=https://www.fml.org/>fml.org</A>), CC BY-NC-SA. (注: <A HREF="/slides/lang/perl/caution/">諸注意から始めてね</A>) </small> </div class=footnote> --- class: compact # おしながき <div class=footnote> <small> (脚注) 公式テキストは情報量が多すぎるので、じゃんけん書くのに大事なところ以外は飛ばしぎみでいきます (リファレンスとしてご利用ください) </small> </div class=footnote> 1. [諸注意](/slides/lang/perl/caution/) 1. 講師陣の御紹介 1. 前回までのあらすじ + ウォーミングアップ 1. 第2回(公式テキスト) - [オンライン版(最新)](https://github.com/perl-entrance-org/workshop-basic-online/blob/master/2nd/slide.md) - [2019年版](https://github.com/perl-entrance-org/workshop-2019/blob/master/2nd/slide.md) 1. [課題] じゃんけんを作ろう (千歳版の独自拡張) 1. (時間に余裕があれば)「配列」をいけるところまで... --- class: compact # 講師陣の御紹介 <div class=footnote> <small> 深町: よく使う言語は**シェル**、とくいな言語は(昔の)Perl、さいきんの浮気先はGo:-) </small> </div class=footnote> - 第2回め以降は手練の社会人IT技術者のみなさんがTAとして参加してくれます <br> 各回、自己紹介してもらいますね --- class: compact # 前回までのあらすじ(1): 演習環境 - 環境構築(WSL + VSCode) - **注: Windowsの上に、もうひとつOSが乗っているので、 VSCodeの起動時には、VSCodeが、どちらのOS上でファイルの作成や検索をしているか気にしてください** - **メニュー -> ubuntu -> 開いてきたターミナル**上で次のコマンドを実行 ``` code perl-entrace ``` するとVSCodeは確実にWSL(仮想環境)側を見ているはずです - 確認: VSCodeを起動して、 VSCodeからperl-entraceというフォルダが見えているなら、 仮想環境を操作して出来ている(はず) --- class: compact # 前回までのあらすじ(2): Perlの基礎 <div class=footnote> <small> (脚注) Unix上で生活していて、ちょいと書いて手早く仕事をあげる一行プログラムで <>などの省略形が活躍 </small> </div class=footnote> - 変数 - 他の言語と異なり**変数名に種類を意味する特殊な文字をつけます** - 特殊文字を見るだけで変数の種類がほぼ確定できます: 例: `$x @y %z $y[0] $z{KEY}` - 前回は、スカラー変数だけ扱いました。配列(`@`)やハッシュ(`%`)は後ほど - 出力 (print 変数, ...) - 入力 (キーボードから読み込むには `変数=<STDIN>`じつは`変数=<>`と略してOK) - 乱数 (ここは呪文だと思ってコピー&ペーストしてもらいました) - srand ... 初期化。 例: `srand(time|$$)` - rand ... 乱数の生成。 例: `rand(3)`は3未満の2.998378983みたいな実数を返します - int ... 整数にする。 例: `int(rand(3))`は(自然数の)0か1か2を返す - 練習課題として「じゃんけん」を作りました --- class: compact # 前回の最終課題(おさらい) - 自分の手を入力し、コンピュータの手と両方を表示してみましょう - [前回の解答例](../janken_01/examples/janken_01__input.pl.txt) ``` 実行例 $ perl janken.pl じゃんけん: 0=グー, 1=チョキ, 2=パー 2 自分 = 2, 相手 = 0 ``` - 注意: 下から2行目の「2」とだけ書いてある行は、キーボードから入力している部分 --- class: compact # ウォームアップ: 前回の最終課題を少し改造 <div class=footnote> <small> 今回は条件文と繰り返し文をならうので、次のプログラムが書けるようになります! <br> コンピュータとジャンケンする(3回勝負) + 毎回、勝ち負けを表示する </small> </div class=footnote> - [前回の解答例](../janken_01/examples/janken_01__input.pl.txt)を少し改造してみましょう。 「自分の手を入力し、コンピュータの手と両方**+結果**を表示してください」 -> [解答例](examples/janken_02__input.pl.txt) - じゃんけんの勝敗は「(3 + 自分の手 - 相手の手)を3で割った余り」で計算できます。 この式は`(3 + 自分の手 - 相手の手) % 3`と書けます。 `print 1 % 3;`や`print 5 % 3;`を試してみよう ``` [実行例] $ perl janken.pl じゃんけん: 0=グー, 1=チョキ, 2=パー 2 自分 = 2, 相手 = 0 結果: 0 = あいこ, 1 = 負け, 2 = 勝ち 2 ``` --- class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第2回<br>条件文と繰り返し <div class=footnote> <small> ハイライトを少し(次頁〜)やってから公式テキスト第2回へ:<A HREF="https://github.com/perl-entrance-org/workshop-basic-online/blob/master/2nd/slide.md">最新版</A>ではなく<A HREF="https://github.com/perl-entrance-org/workshop-2019/blob/master/2nd/slide.md">[2019年版]</A> </small> </div class=footnote> --- class: compact # 条件文 <div class=footnote> <small> (脚注1) つねに<B>{ と }で囲み</B>ます。 C言語の「ぶらさがりelse問題」を避けるためです。 約30年分の反省をしているGo言語も同様に { } を強制します (脚注2) C言語的なelse ifではなくelsifであることに注意 </small> </div class=footnote> ``` if (条件1を書くところ) { 条件1を満たしたときに実行するコード; } if (条件1を書くところ) { 条件1を満たしたときに実行するコード; } elsif (条件2を書くところ) { 条件2を満たしたときに実行するコード; } # 一行に書いてもよい(というか、どう書いてもよい;詩を書いてもよい:-) if (条件1) { 条件1を満たしたときのコード; } else { 条件を満たさないコード; } ``` --- class: compact # 条件を書くところ (比較など) <div class=footnote> <small> (脚注1) たいてい文字と数字は別扱いです。 それは、コンピュータの内部で文字をどう表現するか?に関係しています。 また、大抵の言語で文字と文字列は違う話なのですが、 (C言語とかでなければ)当面無視してOK <br> (脚注2) ちなみに$a=1, $b=1のとき、$a eq $bは真です。 Perlは自動型変換をする言語なので、数字を文字に自動変換後、$a eq $b を評価し、真という意味になります。 <br> (脚注3) さらに脱線。 次のコードは、どう表示されるでしょうか? print 1 if "a" == "b"; </small> </div class=footnote> ``` 数字の比較 # たいていの言語はコレ (FORTRAN由来C言語で普及かな?それなら1950年代〜) $a == $b # equal 例: $a=1, $b=1なら真(条件を満たす) $a != $b # not equal 例: $a=1, $b=1なら偽(条件を満たさない) $a > $b # ここは数学と一緒 例: $a=1, $b=1なら偽(条件を満たさない) $a < $b # ここは数学と一緒 $a >= $b # 数学記号はないので > と = 例: $a=1, $b=1なら真(条件を満たす) $a <= $b # 数学記号はないので < と = 文字の比較 # ここはPerl特有 ([脱線] シェルにもあるけど逆なので注意) $a eq $b # equal 例: $a="takagisan", $b="takagisan"なら真(条件を満たす) $a ne $b # not equal 例: $a="takagisan", $b="takagisan"なら偽(条件を満たさない) ``` --- class: compact # 繰り返し文 <div class=footnote> <small> (脚注) 歴史的に教科書のループ変数は i (iteration の i のはず)ですが、 適宜わかりやすい変数名にしましょう </small> </div class=footnote> 当然C言語風の書き方(1)も出来ますが、 `()`内に繰り返すものを入れる書き方は便利(2)(3) ``` # (1) 3回くり返す for ($i = 0; $i < 3; $i++) { print $i, "\n";} $j = 3; while ($j-- > 0) { print $j, "\n";} # (2) コマンド引数の配列(@ARGV)の要素を一つずつ暗黙の変数$_に入れて繰り返し for (@ARGV) { check_hikisuu($_);} for (@ARGV) { print $_;} # 実行してみよう、引数が表示されます } # (3) "<>"は"<STDIN>"の略;入力があるかぎり暗黙の変数$_に入れつつ繰り返し while (<>) { check_nyuuryoku($_);} while (<>) { print} # キーボードから入れたものをそのまま表示 ($_も;も省略可!) ``` --- name: janken class: title, smokescreen, shelf, no-footer # Perl入学式in千歳 第2回<br>じゃんけんプログラムの作成 <div class=footnote> <small> できた!とか「できたけど、〜のあたりではまった!」とかtweetしてくれるの歓迎 </small> </div class=footnote> --- class: compact # 総合課題 <div class=footnote> <small> (脚注) 日本語で「勝ち」などと表示してもよいのですが、たんにprintするだけでは警告が出るので (Encodeモジュールを使って正しいお作法で書けば警告は出ません) ... </small> </div class=footnote> - 前回のジャンケン、条件文、繰り返し文の合わせ技になります。さて、できるかな? - 混乱してきたらワークシートに書き込みながらやってみよう - 課題 1. 勝負の結果によって「kachi」「make」「aiko」と表示しよう 1. 3回ジャンケンしたら終了する 1. [発展]回数は無制限、ただし「9」を入れたら終了する 1. [発展]回数は無制限、ただし「q」を入れたら終了する (ヒント: どの比較の構文を使うのかな?)