Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
381 lines (256 sloc) 13.1 KB

変数


変数とは?

  • 「変数」は, いわば「データを格納できる箱」です

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

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

    • スカラ変数($):1つの要素を格納できる

    • 配列(@)、ハッシュ(%):複数の要素を格納できる

  • 配列は第2回、連想配列(ハッシュ)は第3回で解説します


スカラ変数

my $foo;
$foo = 1;
print $foo;

$foo = "Hello World";
print $foo;
  • 変数を宣言するとき(初めて使うとき)は, 先頭に my をつけます

  • スカラ変数の先頭には, $foo のように $ をつけます

    • $スカラ(scalar)S , と覚えるとよいでしょう
  • = という記号(代入演算子)を使うことで, 左辺のスカラー変数に右辺の値を入れる(代入する)ことができます

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


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

my $foo;
my $bar = 1;
$bar = "Hello World";
  • プログラム言語の参考書には「意味を持たない名前」として, 以下の単語が変数名として利用されます

    • foo, bar, baz

    • hoge, piyo, fuga

  • これら「意味のない名前」をつけることで, サンプル用, 例示用の変数名ということをはっきりさせるためです

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

  • 逆にいうと, これらの変数名は現場のコードで利用すべきではありません


コメント

my $foo = 1;

print $foo;   # -- ここがコメント部 --

# print $foo; 行頭に # があるため、printは実行されない
  • Perlでは, # より右にある文字列は全てコメントとして扱われます

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

  • この資料の中でも, コメントを使ってコードに補足を行います


変数の出力

my $foo = 1;

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

print '$foo\n'; # シングルクォーテーションで囲うと「$foo\n」が出力される
  • print を使うことで変数を出力することができます

  • 変数を出力する場合は, " "(ダブルクォーテーション)の中に変数を書きましょう

    • " " の中に変数を書くと, その変数の中身が展開されて表示されます
    • ' ' の中では, 展開はされず, 全てがそのまま出力されます
      • 変数だけでなく, \n などもそのまま出力されます
  • \n は改行を意味します


構文チェック

  • perlでは perl -wc hoge.plwcオプションを付けることでPerlの文法に合っているかどうかのチェックが可能です

    $perl -wc foo.pl
    foo.pl syntax OK
    

エラー文

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

my $hoge = "Hello"  # "hello"の後にセミコロンがない

print "$hoge\n";
  • よくありがちなエラーとして, 行末の「セミコロン ; を忘れる」というものがあります
  • 先程のシンタックスチェックや, お約束の3行を書いた場合は次のようなエラーがでます
    syntax error at foo.pl line 7, near "print"
    Execution of foo.pl aborted due to compilation errors.
  • この場合、7行目のprintの周辺でシンタックスエラーが発生しているという意味になります

エラー文は怖くない

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

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

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

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

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


練習問題 (scalar_practice.pl)

  • Perl入学式とYAPCの情報をスカラ変数に格納し, それらの値を出力するスクリプトscalar_practice.plを作成しよう

    • seminar_name この勉強会の名前
    • date 今日の日付
    • venue_name 会場名
    • next_yapc_pref 次回のYAPCの場所
  • 「お約束」の3行を忘れずに!


四則演算


基本的な演算子(四則演算)

my $foo = 4;
my $bar = 2;
my $result;
$result = $foo + $bar;  # 4 + 2 = 6
$result = $foo - $bar;  # 4 - 2 = 2
$result = $foo * $bar;  # 4 * 2 = 8
$result = $foo / $bar;  # 4 / 2 = 2
$result = $foo % $bar;  # 4 % 2 = 0 # 剰余を求める
$result = $foo ** $bar; # 4の2乗は 16

基本的な演算子(剰余)

my $foo = 4;
my $bar = 2;
my $result;
$result = $foo % $bar;  # 4 % 2 = 0 # 剰余を求める

剰余はプログラムの世界で大いに利用されています

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

ここで剰余を使います

1週間は7日なので, 7日後は同じ曜日となります. 14日後も同じ曜日となります. 21日, 28日, 35日...

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

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


基本的な演算子(代入演算子の性質)

my $foo = 4;

$foo = $foo * 3;  # 4 * 3 = 12
  • 代入演算子 = は, 算数のイコールとは性質が異なります

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


基本的な演算子(省略記法)

my $fuga = 100;
my $hoge = 50;

$fuga += 1;      # $fuga = $fuga + 1;と同じ

$fuga -= 1;      # $fuga = $fuga - 1;と同じ

$fuga *= 2;      # $fuga = $fuga * 2;と同じ

$fuga /= $hoge;  # $fuga = $fuga / $hoge;と同じ

基本的な演算子(インクリメント)

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

「1」ずつ加算することを「インクリメント」といいます

前置と後置の違いについては「前置のインクリメントと後置のインクリメントの違い」参照


基本的な演算子(デクリメント)

my $bar = 2;

$bar = $bar - 1;
print "$bar\n"; # 1

$bar -= 1;      # 省略記法
print "$bar\n"; # 0

--$bar;         # 前置デクリメント
print "$bar\n"; # -1

$bar--;         # 後置デクリメント
print "$bar\n"; # -2

「1」ずつ減算することを「デクリメント」といいます


演算の順番

my $foo = 2 + 4 * 3;        # 14

my $bar = ( 2 + 4 ) * 3;    # 18
  • 演算の順序は, ( ) を付けることで変更することができます

  • 通常の数学と同じく, Perlも足し算・引き算より掛け算・割り算の優先順位が高いです

  • 2行目では ( ) を付けることで足し算を先に計算させています


基本的な演算子(文字列連結)

my $foo = 'hoge';
my $bar = 123;

print $foo . $bar . "\n";   # hoge123

print "$foo$bar\n";         # hoge123
  • . (ドット)で, 文字列や変数を連結することができます

  • " (ダブルクォテーション)で囲まれた変数は展開されて表示されるので, 最後のprint文も同じ結果になります


演算の順番(数値演算と文字列連結)

数値演算と文字列連結を混ぜた場合の「アンチパターン(良くない例)」を示します

my $now = 2019;
my $last_showa = 1988;
print "今年は平成" . $now - $last_showa . "年です\n"; # -1988年です

おかしな結果になります. これは演算子の優先順位が .- で同じであり, 左結合のため, 左から演算されるためです.

  1. まず 今年は平成(文字) と 2018(数字) が文字連結されます

  2. 次に、今年は平成2018(文字) から 1988(数字)を引き算しようとし, おかしな結果になります.


演算の順番(数値演算と文字列連結)

文字と数値計算を明確に分けて, 計算してから連結するのが確実です.

my $now = 2019;
my $last_showa = 1988;

print "今年は平成" . ( $now - $last_showa ) . "年です\n";
# 今年は平成31年です

my $heisei = $now - $last_showa;
print "今年は平成" . $heisei . "年です\n";
# 今年は平成31年です
  • 1番目のprint文のように、( )で演算の順序を変更することで、正しい結果になりました

  • 2番目のように、計算結果を別の変数に入れてから連結するのも良いでしょう


演算の順番(演算子の優先順位)

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


練習問題(sansuu1.pl)

以下の問題をPerlの四則演算を使って, 変数を使わずに解いて表示してください.

  • 1+2+3+4+5+6+7+8+9+10

  • 100 ー 200

  • 1000円の品物を消費税8%で買った時の税込価格

  • 半径5mの円の面積(円周率は3.14とする)


練習問題(sansuu2.pl)

以下の問題をPerlの四則演算を使って解いてください.

変数 $pizza を使って解いて表示してください

  • 10個のピザを5人で分けた時の, 一人当たりの個数

  • 10個のピザを3人で分けた時の, 余りの数


標準入力


標準入力

  • 標準入力(Standard Input)とは、プログラムに入ってくるデータです

    • 通常, キーボードから入力されるテキストデータのことを指します

    • 入力の終わりはEnterキー 又は returnキー となります

  • Perl では, この「標準入力」をプログラムの中で <STDIN> と表現します


標準入力

my $str = <STDIN>;  # 標準入力から文字列を受け取り、変数 $str に代入する
chomp $str;         # $strの中の末尾の改行を削除する
print $str;         # $strを表示する
  • 標準入力を使うことで, 端末からPerlに文字列を渡すことができます

  • 1行目では, <STDIN> で端末から入力された文字列を受け取り, 受け取った文字列を変数 $str に代入しています

    • 文字列(Strings)を表す変数として, $str がよく利用されます
  • 2行目では, chomp で行末の改行を削除しています

    • <STDIN> で端末から受け取ったデータには改行が含まれているためです

標準入力

print 'input > ';

my $str = <STDIN>;

chomp $str;

print "$str\n";
  • このコードを実行して, <STDIN>がどのような働きをするか見てみましょう.

練習問題 (hello_stdin.pl)

Your Name?> Taro
Hello Taro!
Your OS?> macOS
macOS is useful OS!
  • "Your Name?> " と画面に表示して名前の入力を求め、入力された名前の左側に Hello、右側に "!" を付けて表示するスクリプト hello_stdin.pl を作成しよう.

  • さらに続けて "Your OS?> " と画面に表示して使用中の OS の入力を求め, 入力されたOS名の右側に "is useful OS!" を付けて表示させるようにもしてみましょう.


練習問題 (calc.pl)

1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0.5
  • 標準入力<STDIN>から0以外の整数を2つ読み込み, それらを四則演算(+, -, *, /)した結果を上の例のように出力するスクリプト calc.plを作成しよう.

お疲れ様でした!

  • 長い時間, Perl入学式第1回お疲れ様でした!

  • これでみなさんもPerlMongerです.

  • 是非Perl入学式のslackに参加して, サポーターや参加者の皆さんと交流しましょう.

  • 不明点もslackで是非質問してください.

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


次回予告

  • 条件分岐「if文, else文」

  • 論理演算子「&&(かつ), ||(または)」

  • スカラー変数の集合,「配列」

  • くりかえし「for文」

You can’t perform that action at this time.