Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
915 lines (517 sloc) 24.1 KB

Perl 入学式 第 2 回

スカラー変数 / コマンドライン引数 編


諸注意

会場について

  • 飲食の可否

  • 手洗いの場所

  • 喫煙場所


諸注意

講義の進行について

  • 講義中の疑問点

  • うまくプログラムが動かない

  • 分からない

上記についてはサポーターが適宜回答やアドバイスを Discord でおこないます。

テキストまたは音声チャットにて個別にサポートしますので、気軽に質問してください。


諸注意

講義環境について

  • Youtube

  • スライド共有ツール

  • Discord


諸注意

本日のサポーター紹介


スカラー変数


スカラー変数

コメント

print "Hello World!";   # -- ここがコメント部 --

# print "Hello! Perl Entrance!"; 行頭に # があるため、printは実行されない
  • 各プログラム言語にはプログラムをわかりやすくするために、コメントを入れる仕組みがあります。

  • Perl では、井桁記号 # より右にある文字列は全てコメントとして扱われます。

  • コメントは実行されません。

  • Perl 入学式のサンプルコードでも、 コメントを使ってプログラムに補足を行います。


スカラー変数

変数とは?

  • 変数へんすう」は、いわば「データを格納できる箱」です。

  • Perl の変数には、「スカラ変数」、「配列はいれつ」、「ハッシュ(連想配列れんそうはいれつ)」という 3 つの種類があります。


スカラー変数

Perl の 3 種類の変数

3 種類の変数は、それぞれの変数の型を示す シジル(sigil) という記号で区別されます。

  1. スカラ変数($ダラー):1 つの要素を格納する。

  2. 配列(@アットマーク):複数の要素を「順番に」格納する。

  3. ハッシュ(%パーセント):複数の要素を「key名 => 値」の組み合わせで格納する。

配列とハッシュは次回以降に解説します。


スカラー変数

スカラー変数を利用する

my $num;    # 変数を宣言する

$num = 1;   # 右辺の 1 を左辺の $num に入れる

print "$num\n"; # \n は改行
  • 変数を初めて使うときは、先頭に my をつけます。

  • 変数を利用できるようにすることを「変数を宣言する」といいます。

  • スカラ変数の先頭には、$num のように $ をつけます。 $スカラ(scalar)S 、と覚えるとよいでしょう。


スカラー変数

スカラー変数を利用する

my $num;    # 変数を宣言する

$num = 1;   # 右辺の 1 を左辺の $num に入れる

print "$num\n";
  • = という記号(代入演算子)を使うことで、「右辺の値」を「左辺のスカラー変数 $foo 」に入れる(代入する)ことができます。

  • 小学校で学んだ算数で、両辺の値が等しいことを指す記号である = ですが、プログラムで使う = とは記号こそ同じでも意味が異なります。

  • 代入演算子については、後ほど四則演算の項でも説明します。


スカラー変数

仮の変数名(メタ構文変数)

プログラム言語の参考書には以下の単語が変数名として利用されることがあります。

  • foo, bar, baz

  • hoge, piyo, fuga

  • Alice, Bob, Carol, Dave, Eve


スカラー変数

仮の変数名(メタ構文変数)

  • これら「意味のない名前」をつけることで、「サンプル用」「例示用」の変数ということを明示します。

  • foo, bar, buz このような単語を使った変数を「メタ構文変数」と呼称します。

  • これらのメタ構文変数は現場のプログラムでは利用してはいけません。

  • 変数名には、明確な名前をつけるようにしましょう。また、現場ごとの命名規則に従うことも大事です。


スカラー変数

変数名に使える文字

  • 変数名として使える文字は以下です。

    • 大文字・小文字の英数字
    • アンダースコア(_)
  • さらに、変数名の先頭文字には以下の文字のみ利用が可能です。

    • 英文字
    • _

スカラー変数

長い変数名の記述

複数の単語で変数名をつける時は、単語間を _アンダースコア で繋げる場合が多いです。

このような _ で単語をつなげる記法をスネークケース(snake_case)といいます。

Perl では基本的にスネークケースを推奨しています。


スカラー変数

スカラー変数を再利用する

my $foo;    # 変数を宣言する
$foo = 1;          # 右辺の 1 を左辺の $foo に入れる
print "$foo\n";    # 1

$foo = "Hello World";   # $foo は宣言済みなので my は不要
                        # 右辺の "Hello World" が 左辺の $foo に入る
print "$foo\n";         # Hello World
  • 宣言した変数を 2 回目以降に使うときは、my は不要です。my は変数を宣言する初回のみ必要です。

  • 値が入っているスカラー変数に別の値を代入すると、変数の中身が上書きされます。


スカラー変数

宣言と代入を同時に行う

my $foo = 1;    # 変数の宣言と同時に代入する

print "$foo\n"; # 1

変数は、宣言と代入を同時に行うことができます。


スカラー変数

クォーテーションによる表示の違い

my $foo = 1;

print "$foo\n"; # " ダブルクォーテーションで囲うと 1 が表示される

print '$foo\n'; # ' シングルクォーテーションで囲うと $foo\n が表示される
  • " " ダブルクォーテーションで変数を囲うと、その変数の中身が表示されます。

  • ' ' シングルクォーテーションで変数を囲うと、変数の中身ではなく、書いてあるままに表示されます。


スカラー変数

エラーメッセージ

#!/usr/bin/env perl
use strict;
use warnings;

my $foo = "Hello"  # "Hello"の後にセミコロンがない
print "$foo\n";

エラーメッセージ

syntax error at prog.pl line 6, near "print"
Execution of prog.pl aborted due to compilation errors.

スカラー変数

エラーメッセージ

  • よくありがちなエラーとして、行末の セミコロン ; を忘れるというものがあります。

  • さきほどの場合、6 行目の print の周辺(上下の行)でシンタックスエラーが発生しているという意味になります。


スカラー変数

エラー文は怖くない

Perl に限らず、プログラムのエラーメッセージのほとんどは英語で表示されます。

最初は戸惑うかもしれませんが、エラーメッセージ中にある行番号を手がかりに直前・直後の行でおかしいところを探してみましょう。

また、エラーメッセージそのものを Google などで検索したり、翻訳することでエラー解決への手がかりを掴むこともできます。


スカラー変数

エラー文は怖くない

エラーが出るのは悪いことではありません。直すべき場所を明示してくれるありがたい指針です。

エラーを出さずにプログラムを習得することはできません。

落ち着いて対処していきましょう。


スカラー変数

練習問題:number.pl

  • 1 から 9 までの好きな数字をスカラー変数に格納し、それらの値を表示するプログラム number.pl を作成しよう!

    • $number$num$int など、数字を入れるのに相応しい変数名を利用してみましょう。
  • 「おまじない」の 3 行を忘れずに!


スカラー変数

練習問題:word.pl

  • 好きなプログラミング言語の名前をスカラ変数に格納し、それらの値を表示するプログラム word.pl を作成しよう!

    • $language$lang など、変数の中身が推測できる変数名を利用しましょう。

出来た方は、Discord のテキストチャットで「出来た!」とリアクションお願いします!


休憩 & 質問 & 雑談 タイム
(5 〜 10 分)


四則演算


四則演算

基本的な演算子(足し算・引き算)

my $foo = 4;
my $bar = 2;
my $result;

# 足し算 +
$result = $foo + $bar;    # 足し算 して $result に代入する
print "$foo + $bar = ";   # 式の表示だけ。改行はしない。
print "$result\n";        # 上の式に続けて $result を表示する

# 引き算 -
$result = $foo - $bar;    # 引き算 して $result に代入する
print "$foo - $bar = ";   # 表示だけ。改行はしない。
print "$result\n";        # 上の式に続けて $result を表示する

算数と同じ + と - が利用できます。


四則演算

基本的な演算子(掛け算・割り算)

my $foo = 4;
my $bar = 2;
my $result;

# 掛け算 * (アスタリスク)
$result = $foo * $bar;    # 掛け算 して $result に代入する
print "$foo * $bar = ";   # 表示だけ。改行はしない。
print "$result\n";        # 上の式に続けて $result を表示する

# 割り算 / (スラッシュ)
$result = $foo / $bar;    # 割り算 して $result に代入する
print "$foo / $bar = ";   # 表示だけ。改行はしない。
print "$result\n";        # 上の式に続けて $result を表示する

算数の掛ける ×*アスタリスク、割る ÷/スラッシュ と、算数と異なる記号を使います。


四則演算

基本的な演算子(べき乗・剰余)

my $foo = 4;
my $bar = 2;
my $result;

# べき乗 **
$result = $foo ** $bar;     # 4 の 2乗 を $result に代入する
print "$foo ** $bar = ";    # 式の表示だけ。改行はしない。
print "$result\n";          # 上の式に続けて $result を表示する

# 剰余 %
$result = $foo % $bar;     # 4 を 2 で割った余りを $result に代入する
print "$foo % $bar = ";    # 表示だけ。改行はしない。
print "$result\n";         # 上の式に続けて $result を表示する

四則演算

剰余の使い所

剰余じょうよは、初めて聞く言葉かもしれません。利用例を解説します。

まず、剰余が 0 であれば、「割られる数」は「割る数」の倍数であることが確認できます。

print 100 % 10;    # 100 / 10 の余りである 0 が表示される

さらに、剰余はグルーピングに利用できます。

例えば「今日の 100 日後の曜日」を求めるとき、100 日分カレンダーを辿るのは大変です。


四則演算

剰余の使い所

1 週間は 7 日なので、7 日後は同じ曜日となります。14 日後も同じ曜日となります。21 日、28 日、35 日... 7 の倍数日後は同じ曜日になります。

これを利用し、100 日 を 7 日 で割ってみます。剰余は 2 となります。

print 100 % 7;    # 100 / 7 の余りである 2 が表示される

今日の曜日と同じであれば剰余は 0、明日の曜日と同じであれば剰余は 1、明後日と同じ曜日であれば 2、と簡単に計算が可能です。

これは、曜日が 7 種類あることを利用したグルーピングです。


四則演算

代入演算子の性質

my $foo = 4;

$foo = $foo * 3;  # 右辺の計算結果( 4 * 3 )が、左辺の $foo に代入される

print "$foo\n";   # 12
  • 代入演算子 = は、算数のイコールとは性質が異なります。

    • 算数   :左辺と右辺が等しいことを示す

    • プログラム:右辺の計算結果を左辺に代入する

  • 上記の例では右辺の「 $foo * 3 」つまり 12 が = の左辺 $foo に代入されます。


四則演算

省略記法

代入演算子( = )を利用して、変数の中身を書き換える処理は多いため、専用の記法が用意されています。

my $bar = 100;
my $foo = 50;

$bar += 1;         # $bar = $bar + 1;と同じ
print "$bar\n";    # 101
$bar -= 1;         # $bar = $bar - 1;と同じ
print "$bar\n";    # 100

$bar *= 2;         # $bar = $bar * 2;と同じ
print "$bar\n";    # 200
$bar /= $foo;      # $bar = $bar / $foo と同じ
print "$bar\n";    # 4

四則演算

インクリメント

1 ずつ加算することを「インクリメント」といいます。この処理も多用するので、専用の記法が用意されています。

my $foo = 4;

$foo = $foo + 1;# 代入演算子を利用
print "$foo\n"; # 5

$foo += 1;      # 省略記法
print "$foo\n"; # 6

++$foo;         # 前置インクリメント
print "$foo\n"; # 7

$foo++;         # 後置インクリメント
print "$foo\n"; # 8

四則演算

インクリメント

前置インクリメントと後置インクリメントを直接 print した場合、以下のような違いがでます。

$i = 0;
print $i++;  # prints 0

$j = 0;
print ++$j;  # prints 1

誤動作の素なので、表示用の変数を用意して代入してから print した方が無難です。

前置インクリメントと後置インクリメントの違いについては perldoc の perlopを参照してください。


練習問題 keisan1.pl

以下の問題を順番に書いて表示してみよう。

  1. 変数 $foo に 10, $bar に 3 を代入し、それぞれを画面に表示させる。

  2. 変数 $foo から 変数 $bar を引いた数を画面に表示させる。

  3. 変数 $foo を 変数 $bar で割った時の余りを表示させる。


練習問題 keisan2.pl

以下の問題を順番に書いて表示してみよう。

  1. 変数 $num に 8 を代入し画面に表示させる。

  2. 省略記法を使って、変数 $num を 10 倍し、画面に表示させる

  3. $num を 3 回インクリメントし、画面に表示させる。(正しくプログラムが書けていれば、83 と表示されるはずです。)


出来た方は、Discord のテキストチャットで「出来た!」とリアクションお願いします!


休憩 & 質問 & 雑談 タイム
(5 〜 10 分)


文字列連結


文字列連結

文字列連結

my $word = 'word';
my $num = 123;

print "$word$num\n";         # word123

print $word . $num . "\n";   # word123

my $str = $word . $num;
print $str . "\n";          # word123
  • . (ドット)で文字列や変数を連結することができます。

  • 連結した文字列や変数を、別の変数に代入することも可能です。


文字列連結

数値演算と文字列連結は分ける

演算の優先順位と結合方向(演算の向き)は perldoc の perlop の項に詳細が記載されています。

しかし、これを覚えるのも、他の人に読んでもらうのも大変な労力です。以下のように、わかりやすい記述を心がけましょう。

  • ( ) で演算の順番を明確に示す

  • 数値演算と文字列の連結は分けて書く


文字列連結

演算の順番(四則演算の補足)

my $num1 = 2 + 4 * 3;
print "$num1\n";    # 14

my $num2 = ( 2 + 4 ) * 3;
print "$num2\n";    # 18
  • 演算の順序は、 ( ) を付けることで変更することができます。

  • 通常の算数と同じく、Perl も「足し算・引き算」より「掛け算・割り算」の優先順位が高くなっています。

  • 下段の例では ( ) を付けることで優先順位を変え、「足し算」を先に計算させています。


文字列連結

数値演算と文字列連結の混合

my $now                 = 2022;

my $start_perl_entrance = 2012;

print "Perl入学式は開講" . $now - $start_perl_entrance . "年です\n";
# Argument "PerlM-eM-^EM-%M-eM--M-&M-eM-<M-^OM-cM-^AM-/M-iM-^VM-^KM-h..." isn't numeric in subtraction (-) at / line 8.
# -2012年です

上のプログラムは、警告が出た上に「-2012 年です」と、おかしな結果になります。

これは数値演算と文字列連結を混ぜた「アンチパターン(良くない例)」です。


文字列連結

数値演算と文字列連結の混合

  1. まず 「Perl入学式は開講」(文字列) と 「2022」(数字) が文字連結されます。(結果:「今年は開講 2022」)

  2. 次に、「今年は開講2022」(文字列) から 「2012」(数字)を引き算しようとし、おかしな結果になります。


文字列連結

数値演算と文字列連結は分ける

my $now                 = 2022;

my $start_perl_entrance = 2012;

print "Perl入学式は開講" . ($now - $start_perl_entrance ). "年です\n"; # Perl入学式は開講10年です

文字と数値計算は ( ) を用いて明確に分け、その後に連結するのが確実です。


文字列連結

数値演算と文字列連結は分ける

my $now                 = 2022;

my $start_perl_entrance = 2012;

my $period = $now - $start_perl_entrance;
print "Perl入学式は開講" . $period . "年です\n"; # Perl入学式は開講10年です

計算結果を別の変数に入れてから連結するのも良い手法です。


コラム:YAPCへ行こう!


コラム:YAPCへ行こう!

年に一度、Perl のお祭りが開かれます。

それが YAPCヤプシー と呼ばれるイベントです。

2015年までは東京で、2016年からは日本各地で会場を移しつつ開催しています。

次回は 2023年3月19日に京都で開催予定です。

YAPC::KyotoをRebootします - YAPC::Japan 運営ブログ
https://blog.yapcjapan.org/entry/2022/10/26/161847

YAPC では Perl や Perl を利用したシステムについての発表が行われます。


コラム:YAPCへ行こう!

これまで各地で開催されてきたYAPCのイベントページです。

画面上部の TIMETABLE からどのような発表が行われたのか、確認ができます。

YAPC::Asia Tokyo 2015 http://yapcasia.org/2015/

YAPC::Hokkaido 2016 SAPPORO https://yapcjapan.org/2016hokkaido/

YAPC::Kansai 2017 OSAKA https://yapcjapan.org/2017kansai/

YAPC::Fukuoka 2017 HAKATA https://yapcjapan.org/2017fukuoka/


コラム:YAPCへ行こう!

YAPC::Okinawa 2018 ONNASON https://yapcjapan.org/2018okinawa/

YAPC::Tokyo 2019 https://yapcjapan.org/2019tokyo/

Japan.pm 2021 https://yapcjapan.connpass.com/event/198170/


コラム:YAPCへ行こう!

発表には、初心者には難しい内容のものもあります。

しかし気負わずに「こんな世界もあるんだ〜」程度に聴講すると、数年後にふと繋がることもあります。

懇親会に参加すると、さらに業界や Perl 界隈の裏話が聴けたりもします。

Perl入学式のサポーターは大概参加しています。

皆さんの参加をお待ちしています。


コマンドライン
引数ひきすう


コマンドライン引数

入力とは?

  • これまでは、あらかじめプログラムに書かれた文字や数字を表示してきました。これを「出力」といいます。

  • 出力に対して、「入力」はプログラムやコンピュータに様々な数値や文字列を与えることをいいます。

  • この「入力」を用いて、プログラムの実行の都度、中身や出力を変えることができます。

  • コマンドライン引数は、プログラムが入力を受け取る方法の一つです。


コマンドライン引数

コマンドライン引数を設定する(ターミナル)

ターミナルの場合には、以下のようにしてコマンドライン引数を設定します。

arg とあるのが引数です。(arg は 引数 argument という語の略語です)

$ perl single.pl arg

複数の引数を受け取る場合には、空白で区切って列挙します。

$ perl multi.pl arg1 arg2

この argarg1, arg2 にある文字や数字がプログラムに入力されます。


コマンドライン引数

コマンドライン引数を設定する(Wandbox)

Wandbox の場合には、画面左上、バージョン情報の下にある Runtime options: の入力欄に「1 つの引数につき 1 行」で入力します。



コマンドライン引数

Perl でコマンドライン引数を受け取る

まず、コマンドライン引数を受け取るために、プログラム側では変数を用意し、shift で代入します。

# コマンドライン引数の左から1番目の値を受け取り、変数 $first に代入する
my $first = shift;

# コマンドライン引数の左から2番目の値を受け取り、変数 $second に代入する
my $second = shift;

print 'first is ' . "$first\n";      # $first を表示する
print 'second is ' . "$second\n";    # $second を表示する

コマンドライン引数

Perl でコマンドライン引数を受け取る

ターミナルでコマンドライン引数をつけて実行

$ perl season.pl autumn

コマンドライン引数を受け取るプログラム例

my $season = shift;   # コマンドライン引数 autumn を受け取り、
                      # 変数 $season に格納する

print "Alice loves $season\n";    # Alice loves autumn

このように、コマンドライン引数によってプログラムの実行結果を変えることが可能です。


練習問題 hello_name.pl

コマンドライン引数にあなたの名前をローマ字(アルファベット)で入力して実行すると、

Hello, あなたの名前!

と表示されるようなプログラム hello_name.pl を作成しよう。

$ perl hello_name.pl Taro
Hello, Taro!

練習問題 calc_argument.pl

コマンドライン引数 から 0 以外の整数を 2 つ読み込み、 それらを四則演算(+, -, *, /)した結果を下の例のように表示するプログラム calc_argument.plを作成しよう。

最初のコマンドライン引数に 1 、次に 2 を入れた場合、以下のように表示されるプログラムです。

$ perl calc_argument 1 2
1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0.5

出来た方は、Discord のテキストチャットで「出来た!」とリアクションお願いします!


休憩 & 質問 & 雑談 タイム
(5 〜 10 分)


お疲れ様でした!

サポーターや参加者の皆さんと交流しましょう。

不明点は Discord #雑談部屋 で是非質問してください。

「●●をやりたいが、何から手をつけていいかわからない」といった質問にも、何かしらアドバイスやヒントを提供できる場になればと考えています。

次回以降の参加もお待ちしております!