SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
Perl 勉強会#2
実⾏⽅法、お約束、変数、制御構⽂、繰り返し構⽂


2012/02/25




kiyotune

常住規代 / Kiyo Tsunezumi
1.はじめに

1­1.参考書

 『プログラミングPerl〈VOLUME1〉 』http://www.amazon.co.jp/dp/4873110963    ※定価¥5565


 『プログラミングPerl〈VOLUME2〉 』http://www.amazon.co.jp /dp/4873110971   ※定価¥4935


 『初めての Perl 第 5 版』※定価¥3780


 『続・初めての Perl 第 5 版』※定価¥3780




                                                                            通称:ラクダ本
                                                                            中規模以上向けのテクニック等、発展的内容
                                                                            が多い。




                   通称:リャマ本(白リャマ&黒リャマ)
                   初心者向け。スクリプトの書き方から順を追っ
                   て解説。
1­2.⾃学⽤Webサイト

本は買(いたくない|えない)という⼈は Web サイトでも可(なかなか体系だった知識が⾝につきにくいのが難点ですが)。




 [Perl doc] http://perldoc.perl.org/ ※総本⼭


     [Perl doc - ⽇本語化プロジェクト] http://perldoc.jp/


         [(上記サイト)コア] http://perldoc.jp/index/core


         [(上記サイト)関数] http://perldoc.jp/index/function


         [(上記サイト)モジュール] http://perldoc.jp/index/module ※⼀部のみ




 [サンプルコードによる Perl ⼊⾨] http://d.hatena.ne.jp/perlcodesample/


     [(上記サイト)Perl 基礎⽂法最速マスター] http://d.hatena.ne.jp/perlcodesample/20091226/1264257759




メールマガジンでは以下のようなものがあります。




 [Perl で書く] http://archive.mag2.com/0000109251/index.html
1­3.Perlスクリプトの書き⽅と実⾏⽅法

(例)コマンドライン画⾯に'Hello World'と表⽰させるスクリプト


1-3-1.新しく ファイルを開く



1-3-2.スクリプトを書く(perlstudy2_000.pl)

   print "Hello Worldn";



  print:画⾯に⽂字列を表⽰するためのコマンド


  ¥n:"¥"+n:⽂字列の最後で改⾏することを指⽰します


  ⽂の最後はセミコロン『;』で終わりましょう。


  『#』以降はコメント⽂として無視されます。変数や関数の説明や、変更履歴などを書くと後で⼤変役に⽴ちます。


  空⽩は半⾓スペースかタブ⽂字のみです。全⾓スペースが画⾯上に表⽰されるようにエディタに設定しておくとうっかりミスを防げます。
1-3-3.適当な名前をつけて保存する

※ここでは"perlstudy2_000.pl"という名前で保存しています。




1-3-4.Perlでスクリプトを実⾏

   $> perl perlstudy2_000.pl
   Hello World
   $>
1-3-5.もっと簡単に実⾏する⽅法

 (4)ではスクリプトを実⾏するのに Perl の実⾏コマンドに作成したスクリプトファイルを指定する必要がありましたが、ファイルそのものをスクリプトとして実⾏


する⽅法もあります(この⽅法で実⾏させることが多いです)。


 スクリプトの"⼀⾏⽬"に以下のような⽂を追加してください(perlstudy2_001.pl)。



  #!/usr/bin/perl
  :



 ⾏頭の『#!』は『シバン(shebang)』といい、起動してスクリプトを読み込むインタプリタを指定するコマンドです。


 『#!』と後に続くインタプリタ(ここでは Perl)のパスとの間はスペースを開けないでください。


 この⾏で Perl の実⾏ファイルの場所(パス)を指⽰します。以下のように調べることができます。



  $> which perl
  /usr/bin/perl ※ここの⾏をコピペ
(1) 実⾏

   $> ./perlstudy2_001.pl
   -bash: ./perlstudy2_001.pl: Permission denied




 bash(使⽤しているシェルの名前)に"Permission denied(権限拒否)"と怒られてしまいました。


 ファイル(perlstudy2_001.pl)にスクリプトとしてファイルを実⾏させる為の権限がないからです。


 Linux などの多くの環境では、ファイルをスクリプトとして実⾏させるためにはファイルに実⾏権限を与えてやる必要があります(ファイル作成時に最初から実⾏


権限を与えている環境もあるが、セキュリティ上の観点からないことの⽅が多い)。




(2) 実⾏権限の確認

   $> ls -l perlstudy2_001.pl
   -rw-r--r-- ...
      ^ ここの部分に'x'があるとファイルの所有者の実⾏権限があるという意味になる



 ファイルの所有者(⾃分)に実⾏権限がありません。以下の⼿順でファイルに実⾏権限を与えてやります。
(3) スクリプトファイルに実⾏権限を与える

    $> chmod u+x perlstudy2_001.pl



 ※ chmod:ファイルの実⾏権限を与えるコマンド(ファイル所有者が⾃分である場合のみ使⽤可) u+x:所有者(u)に実⾏権限(x)を与える(+)の意味
                                                、




(4) 実⾏権限を確認

  $> ls -l perlstudy2_001.pl
  -rwxr--r-- ...
     ^ ここの部分に'x'があるとファイルの所有者の実⾏権限があるという意味になる



 実⾏権限があることが確認できたので Perl スクリプトを実⾏します。




(5) 再び実⾏

  $> ./perlstudy2_001.pl
  Hello World
  $>

(4)と同じ結果が出⼒されました。
1­4.⼊出⼒(標準⼊出⼒)

ここでは画⾯やキーボードなどでデータをやり取りする⽅法を説明します。




1-4-1.標準⼊出⼒とは



  標準⼊⼒(STDIN):キーボード


  標準出⼒(STDOUT):画⾯(ディスプレイ)


※STDIN,STDOUT:スクリプト内で標準⼊出⼒を⽰す特殊変数




1-4-2.標準⼊⼒の⽅法

 キーボードからデータを受け取るには以下のように行います。

   $instr = <STDIN>;

※$in_str:⼊⼒したデータを格納する変数


※<XXXXX>:ファイルハンドル XXXXX からデータを読み出す⾏⼊⼒演算⼦『<>』。ここでは標準⼊⼒ STDIN をファイルとみなしている。



【注意】
キーボードで改行を入力した所でデータが読み取られます。改行まで含まれます。キーボード入力値を使ってデータの操作を行う場合、末尾の改行コードを考慮し
ないと予期しない結果が得られることがあります。
1-4-3.標準出⼒の⽅法

 画⾯上へのデータの出⼒には print 関数を使います。(他にもいろいろありますがここでは割愛します)


<使い⽅>

    print (出⼒させたい⽂字列や数値のリスト);



【使い⽅の例:perlstudy_print.pl】

    #!/usr/bin/perl

    $str = "こんにちは";
    $str2 = "コンニチハ";
    $num = 3.14;
    print $str;
    print "nt => ⽂字列を出⼒n";
    print $num;
    print "nt => 数値を出⼒n";
    print "$str $num";
    print "nt => ⽂字列と数値を同時に出⼒(ダブルクオテーションでくくると⽂字列として処理される)n";
    print("⽂字列を"(ダブルクオテーション)でくくると変数や制御⽂字が展開されて出⼒されますn");
    print("⽂字列変数「$str」や数値変数「$num」も""(ダブルクオテーション)内に埋め込んで出⼒することができます」n");
    print "関数のかっこ()は省略することが可能ですn";
    print '⽂字列を'でくくると改⾏コードや変数が展開されなくなりますn';
    print "n ⽂の先頭や⽂の途中で改⾏することも可能です。n 改⾏n";
    print "<発展>n";
【使い⽅の例(発展):perlstudy_print.pl】

    print << "PRINT_DOCUMENT";
    ***
    これは『ヒアドキュメント』という出⼒⽅法です。
    print ⽂の代わりに変数に代⼊することも可能です。
    改⾏もそのまま出⼒されます。
    変数も展開されます($str)
    ヘルプメッセージなどの⽂章を出⼒するのに便利です。
    ***
    PRINT_DOCUMENT

【実⾏例:perlstudy_print.pl】

    $> ./perlstudy2_001.pl
    こんにちは
             => ⽂字列を出⼒
    3.14
             => 数値を出⼒
    こんにちは 3.14
             => ⽂字列と数値を同時に出⼒(ダブルクオテーションでくくると⽂字列として処理される)
    ⽂字列を"(ダブルクオテーション)でくくると変数や制御⽂字が展開されて出⼒されます
    ⽂字列変数「こんにちは」や数値変数「3.14」も""(ダブルクオテーション)内に埋め込んで出⼒することができます」
    関数のかっこ()は省略することが可能です
    ⽂字列を'でくくると改⾏コードや変数が展開されなくなりますn
    ⽂の先頭や⽂の途中で改⾏することも可能です。
    改⾏
    <発展>
    ***
    これは『ヒアドキュメント』という出⼒⽅法です。
    print ⽂の代わりに変数に代⼊することも可能です。
    改⾏もそのまま出⼒されます。
    変数も展開されます(こんにちは)
    ヘルプメッセージなどの⽂章を出⼒するのに便利です。
    ***
1-4-4.【演習】標準⼊⼒から取得したデータを標準出⼒で表⽰する



  !!! Do It Yourself !!!




                           INTERMISSION

                             (休憩)
2.Perlでスクリプトを書くときに幸せになる3つの呪⽂

2­1.『use strict』

 簡単に⾔うと「好ましくない操作を⾏おうとするとエラーにしてくれる」呪⽂です。


 下⼿にプログラムが動くと期待しない結果になった時に原因がわからなくなる時があります。詰みます。


 追加のインストールは不要です。


 以下ののオプションがあります。




  『vars』my,our,use vars など、変数の有効範囲を指定した宣⾔をせずに変数を使おうとするとエラーを出⼒する


  『refs』シンボリックリファレンスが使われた時にエラー出⼒する


  『subs』サブルーチン以外の裸の識別⼦を使おうとした時にエラーを出⼒する




 最初は『vars』以外は意識して使うことはないと思いますが、とりあえずスクリプト冒頭に「use strict;」と書いておけば OK です。何も指定しないと全てのオ


プションを指定したのと同じ意味になります。
2-1-1.use strictがない場合 - varsの例(perlstudy2_100.pl)

   #!/usr/bin/perl

   $greeting = "Hello Worldn";
   print "<⼀度⽬の挨拶>n";
   print $greeting;

   #
   # (あれやこれや処理を書く)
   #

   # 最初に定義した$greeting 変数を使う
   # $greeting のつもりで$greetings とタイプミス
   print "<⼆度⽬の挨拶>n";
   print $greetings;

【実⾏例】

   <⼀度⽬の挨拶>
   Hello World
   <⼆度⽬の挨拶>




 ⼆度⽬の挨拶の出⼒では$greeting のつもりで$greetings とタイプミスしてしまったので何も出⼒されませんでした。これでは何がまずかったのかよくわかりませ


ん。"use strict"を書いておくとこういうトラブルを防ぐことができます。
2-1-2.use strictがある場合 – varsの例(perlstudy2_101.pl)

   #!/usr/bin/perl

   use strict;

   my $greeting = "Hello Worldn"; #変数 $greeting     の宣⾔(と⼀緒にデータをセット)。
   print "<⼀度⽬の挨拶>n";
   print $greeting;

   #
   # (あれやこれや処理を書く)
   #

   # 最初に定義した$greeting 変数を使う
   # $greeting のつもりで$greetings とタイプミス
   print "<⼆度⽬の挨拶>n";
   print $greetings; #<<< line.21

【実⾏例】

   <⼀度⽬の挨拶>
   Hello World
   <⼆度⽬の挨拶>
   Global symbol "$greetings" requires explicit package name at ./perlstudy2_101.pl line 21.
   Execution of ./perlstudy2_101.pl aborted due to compilation errors.



 use strict を指定しているのに、21 ⾏⽬の”$greetings”という変数が宣⾔されていない(宣⾔したつもりがタイプミス)ためにエラーが起こって実⾏が中断されて


います。これにより、エラーの原因の⼿がかりを得ることができます(ここではエラーメッセージだけでは原因はよくわかりません)。


※my:プログラムで使う変数を宣⾔するための予約語
2­2.『use warnings』

 より詳しいエラーメッセージと共に、まずい使い⽅をしている箇所を警告してくれる呪⽂です。


 warnings モジュールを CPAN でインストールする必要があります。




2-2-1.warningsインストール⽅法 ※要:管理者権限



   $> sudo perl -MCPAN -e shell
   cpan> install warnings




  warnings がない場合(2-1-2:perlstudy2_101.pl)とある場合を⽐べてみましょう。
2-2-2.warningsがある場合(perlstudy2_102.pl)

   #!/usr/bin/perl

   use warnings;

   $greeting = "Hello Worldn";
   print "<⼀度⽬の挨拶>n";
   print $greeting;

   #
   # (あれやこれや処理を書く)
   #

   # 最初に定義した$greeting 変数を使う
   # $greeting のつもりで$greetings とタイプミス
   print "<⼆度⽬の挨拶>n";
   print $greetings; # <<< line 16



【実⾏例】

   Name "main::greetings" used only once: possible typo at ./perlstudy2_102.pl line 16.
   <⼀度⽬の挨拶>
   Hello World
   <⼆度⽬の挨拶>
   Use of uninitialized value $greetings in print at ./perlstudy2_102.pl line 16.



  『16 ⾏⽬の greetings という変数が⼀度しか使われていない。typo では?』


  『greetings という変数が初期化されてないのに使われてる。』


 と怒られているのがわかります。このように "use strict"だけを指定した場合と⽐べても、より詳しいエラー内容が出⼒されていることがわかります。
2­3.『use utf8』

 ソースコードで Unicode(UTF-8)を扱うことができるようになります。


指定がない場合、⽂字列が単なるバイト列として扱われ⽂字列の検索で不都合が起きる場合があります。


use utf8 がある場合とない場合の例は⽂字コードの深い話になってしまうのでここでは割愛します。使い⽅だけ⽰します(use strict, use warnings も併記)。


2-3-1.use utf8 の使い⽅(perlstudy2_103.pl)

   #!/usr/bin/perl

   use strict;
   use warnings;
   use utf8;

   #標準出⼒に使う⽂字コードを utf8 に設定する。
   binmode STDOUT, ":encoding(utf8)";

   #変数の宣⾔
   my $greeting;

   $greeting = "Hello Worldn";
   print "<⼀度⽬の挨拶>n";
   print $greeting;

   #
   # (あれやこれや処理を書く)
   #

   # 最初に定義した$greeting 変数に別の挨拶を代⼊
   $greeting = "こんにちはこんにちはn";

   print "<⼆度⽬の挨拶>n";
   print $greeting;
【演習】use utf8 の挙動確認


use utf8 がない場合の挙動を試してみる。binmode                STDOUT...がない場合の挙動を試してみる。




2­4.use xxxxxって何?(補⾜)

 perl モジュール(ライブラリ)を読み込むためのコマンドです。


 スクリプト起動時、他の処理を実⾏する前に読み込まれます。


 CPAN から warnings や utf8 以外の様々な役割のモジュールをダウンロードすることができるので試してみてください。



  [CPAN]
  http://www.cpan.org/

  [CPAN ⽇本語サーチサイト]

  http://search.cpan.org/~dapm/perl-5.10.1/README.jp

  [CPAN モジュールガイド(書籍)]

  http://www.amazon.co.jp/dp/486267108X
INTERMISSION

  (休憩)
3.変数

3­1.変数(名)とは何か

【⼀般的な概念:http://e-words.jp/w/E5A489E695B0.html】



     プログラムのソースコード中で、データを⼀時的に記憶しておくための領域に固有の名前を付けたもの。変数につけた名前を変数名と呼び、記憶されてい


   るデータをその変数の値という。データの⼊れ物のような存在で、プログラム中で複数のデータを扱いたいときや、同じデータを何度も参照したり計算によ


   って変化させたい場合に利⽤する。


     変数をプログラム中で利⽤するには、⾃分がこれからどんな変数を利⽤するかを宣⾔し、値を代⼊する必要がある(宣⾔が不要な⾔語や処理系もある)。変


   数に格納された値を利⽤したいときは、変数名を使って参照する。多くの⾔語では、整数、実数、⽂字列など、変数に利⽤できるデータの種類(データ型)が


   決まっており、宣⾔や代⼊の際にその変数がどのデータ型かを指定する必要がある。
3-1-1.Perlの変数

  変数の宣⾔は必要ない。使いたい時に使える。※前述の use strict が指定されている場合は除く


  データ型を指定する必要はない。Perl が内部で使⽤⽤途に応じて判断する


【実⾏例:1-4-3.標準出⼒の⽅法(perlstudy_print.pl)】


     浮動⼩数点(3.1415...)も整数(1, 2, 3...)も⽂字列(abc)も型指定することなく同じ変数に代⼊できる。




3-1-2.変数というものがないとどうなるか(余談)

  コンピュータの記憶領域の番地(数字)を指定し値を書き込み、参照するときはその番地を指定して読みだす必要がある。


  コンピュータの構造(プロセッサ)によって記憶領域の番地の付け⽅が違うので、コンピュータ毎に番地を変えてプログラムを書く必要がある。


 => ⾯倒、値がどういう種類のものかわかりにくい          => 数値の番地に代わる名前(タグ)をつけて管理 => 変数(名)


 【例:住所】[⼈]    データ、[メモリの番地] 緯度経度、住所:変数名
3­2.変数の種類

3­2­1.単純変数(変数)

 ⼀つの値(リテラル値)を⼊れるための箱


 同じ変数に続いて値を⼊れる(代⼊)と前の値は上書きされる


【書き⽅】


    『$』に続いて変数名を記述する

  $varname   =   1;    #整数'1'を表す
  $varname   =   1.56; #整数'1.56'を表す
  $varname   =   "abcde";            #⽂字列'abcde'を表す
  $varname   =   'これは⽂字列ですn';      #⽂字列を表す変数(シングルクォーテーションで括る)
  $varname   =   "これは⽂字列ですn 改⾏"; #⽂字列を表す変数(ダブルクォーテーションで括る)

※変数に続いて 『=』で値を設定することを、
                     『変数の初期化』という。


※⽂字列のシングルクォテーション『ʼ』とダブルクォーテーション『”』の違い => (see.) 1-4-3.標準出⼒の⽅法
3­2­2.単純配列(配列)

 複数の値を 1 つの名称でグループ化して⼊れるための箱


 特定の場所の値を取り出す(参照する)のに整数の値(添字、インデックス)を使う


 同じ名称の配列の同じ添字に続いて値を⼊れると前の値は上書きされる。


 配列の添字は 0 から始まる。


【書き⽅】


    『@』に続いて配列名を記述する:


<例1:添字で配列の場所を指定して値を代⼊(配列の初期化)>


    $+配列名+[(添字)]=XXX ※『[』:Bracket

  $arrname[0] = 1;
  $arrname[1] = 2;
  $arrname[2] = 3;



<例2:リストで配列を初期化>


    @+配列名 = (リスト)

  @arrname = (1, 2, 3);

※リスト:値のをカンマ区切りの丸括弧『()』でくくったもの。値の集合。
3­2­3.連想配列(ハッシュ)

  連想配列の添字(キー)を単純配列のように連続する数値でなく任意の⽂字列で表したもの


  特定の場所の値を取り出すのに値を代⼊する時に使った⽂字列を使う。


【書き⽅】


     『%』に続いて配列名を記述する:


<例1:添字で配列の場所を指定して値を代⼊(配列の初期化)>


     $+配列名+{(添字)}=XXX            ※『{』
                                    :Curly Blacket

   $hashname{apple} = 'red';
   $hashname{lemon} = 'yellow';
   $hashname{'Apple'} = 'Red';
   $hashname{'Lemon'} = 'Yellow';
   $hashname{"_Apple"} = '_Red';
   $hashname{"_Lemon"} = '_Yellow';



<例2:リストで配列を初期化>


     @+配列名 = (リスト)

   %hashname = ('apple','red','lemon','yellow','Apple','Red','Lemon','Yellow','_apple','_red','_lemon','_yellow');

※リストの先頭から順に、Key1, Value1, Key2, Value2...と解釈されて配列が初期化される。


<例3:リストで配列を初期化(その2)>
@+配列名 = (リスト)

  %hashname = ('apple'=>'red','lemon'=>'yellow','Apple'=>'Red','Lemon'=>'Yellow','_apple'=>'_red','_lemon'=>'_yellow');




3­2­4.変数名(配列名)のお約束

 1 ⽂字⽬は必ず英字(a_zA_z)またはアンダースコア(_)で始まる


 2 ⽂字⽬以降は英数字(a-zA-z0-9)またはアンダースコア(_)でも可


例)【OK】$a, $abc, $a01, $a01_23, 【NG】$123


 ⼤⽂字と⼩⽂字は区別される


 変数名の⻑さの制限はない


 同じ名称で変数($)、単純配列(@)、連想配列(%)は別の変数として扱われる。


例)$name, @name, %name は別の変数
3­3.変数の型


 C ⾔語で⾔うところの整数、浮動⼩数点、⽂字列のような型の定義はありません。




3­4.特殊変数(配列)


 宣⾔しなくても Perl のスクリプトを実⾏した時に環境に応じた何らかの値が⼊っている変数(配列)
                                                 。前に出た、標準⼊出⼒(STDIN、STDOUT)など。




 (1) 正規表現に関連する特殊変数


 (2) ファイルハンドル毎の特殊変数


 (3) グローバルな特殊変数


 (4) グローバルな特殊配列


 (5) グローバルな特殊ファイルハンドル




http://wiki.stsd.info/perl/54m55q6K5aSJ5pWw5LiA6Kan.html


http://d.hatena.ne.jp/gnjdg6457/20110202/p1
3­5.その他変数の説明でよく出てくる⽤語の説明


  『スカラー』


 ・リスト(配列)などではなく数値や⽂字列など単純な値のこと。


  『リスト』


 ・値(スカラー)の集合。


 ・値をカンマ区切りの丸括弧『()』でくくったもの。


  ・変数として名前が付けられていないものを『無名リスト』ともいう。


 ・名前付きリストのことを連想配列(ハッシュ)という。s


  『リテラル(literal)』


 ・literally(⽂字通り)に由来


 ・変数を介してではなく数値や⽂字列など値そのものを指す
INTERMISSION

  (休憩)
4.演算⼦

4­1.演算⼦の種類

    算術演算⼦:加減剰余(+, -, *, /), 余り(%), べき乗(**), ++(インクリメント), --(デクリメント)


    代⼊演算⼦:単なる代⼊(=), 計算結果を代⼊(+=, *=, -=, /=, **=, %=), ⽂字列を連結して代⼊(.=)


    ビット演算⼦:論理和(|), 論理積(&), ~(否定), 右ビットシフト(>>), 左ビットシフト(<<)


    ⽐較演算⼦:数値⽐較(<, >, <=, >=), 数値等価(==), 数値不等価(!=), ⽂字列等価(eq), ⽂字列不等価(ne),⽂字列⼤⼩⽐較(le, ge, lt, gt)


    論理演算⼦:NOT, AND, OR, XOR


    条件演算⼦:条件分岐の中で使われる演算⼦(&&, ||)


など他にもたくさん。



http://perldoc.jp/docs/perl/5.6.1/perlop.pod
4­2.演算⼦の優先順位と結合性

http://perldoc.jp/docs/perl/5.14.1/perlop.pod#Operator32Precedence32and32Associativity


4-2-1.演算⼦の優先順位


【例】2+4*5

    演算⼦の優先順位 とは、他の演算⼦より先に評価される演算⼦が あるということです。 例えば、2 + 4 * 5 の場合、乗算が⾼い優先順位を持っているの
    で、 4 * 5 が先に評価され、結果は 6 * 5 == 30 ではなく、 2 + 20 == 22 となります。

   乗算『*』は加算『+』より優先順位が⾼い演算⼦なので、上の式は、2                             + (4 * 5)のようにかっこの中から計算されます。


   もし、優先順位の低い演算⼦から計算したい場合は、(2+4)*5 のようにかっこでくくりましょう。


   不安なときはかっこでくくると間違いが少ないです。




4-2-1.演算⼦の結合性


【例】8-4-2

    演算⼦の結合性 は、同じ演算⼦が連続して現れた場合に何が起こるかを 定義します: 評価器が左側を先に評価するか右側を先に評価するかです。 例えば、
    8 - 4 - 2 の場合、減算は左結合なので、Perl は式を左から 右に評価します。 8 - 4 が先に評価されるので、8 - 2 == 6 ではなく 4 - 2 == 2 とな
    ります。

   減算『-』の結合性は『左結合』、よって、同じ演算⼦が連続する四季の場合は左側から計算が⾏われます。


   よって上の式は、(8 - 4) - 2 のようにかっこのついた側から計算されていきます。
5.制御構⽂

5-1..条件⽂


5-1-1.if⽂

 条件式が TRUE の場合に処理を実行します。

   if (条件式 1) {
      処理1
   } elsif (条件式2) {
      処理2
   } elsif (条件式3) {
      処理3
   } else {
      条件1〜3がいずれも偽(FALSE)の場合に実⾏される処理
   }

  処理が⼀⾏で終わる場合でもブラケット『{}』は省略することができません。


  else if でも elseif でもなく『elsif』なので注意。


5-1-2.unless⽂

 条件式が FALSE の場合に処理を実行します。

   unless (条件式) {
     処理
   }else{
     条件式が真(TRUE)の場合に実⾏される処理
   }

  処理が⼀⾏で終わる場合でもブラケット『{}』は省略することができません。


  if ⽂と異なり elsif に相当する式は存在しません。
if ⽂の条件式を否定『!』すれば if ⽂でも書けるので、最初のうちは使わないほうがよいかもしれません。


5-1-3.switch, select ⽂に相当する構⽂


 標準では存在しません。地道に if ⽂で実装しましょう。


 ただし、CPAN で Switch モジュールをインストールすれば Switch 構⽂が使えるらしいです。


http://search.cpan.org/~rgarcia/Switch-2.16/Switch.pm


 【Switch モジュールの例】

    use Switch;

    switch ($val) {
        case 1            { print "number 1" }
        case "a"          { print "string a" }
        case [1..10,42]   { print "number in list" }
        case (@array)     { print "number in list" }
        case /w+/          { print "pattern" }
        case qr/w+/        { print "pattern" }
        case (%hash)       { print "entry in hash" }
        case (&sub)       { print "arg to subroutine" }
        else              { print "previous case not true" }
    }
5-2.繰り返し⽂

5-2-1.while⽂

最初に条件式を評価し、真(TRUE)の間処理を繰り返す。1回⽬の条件式評価で FALSE だと⼀度も処理を実⾏しないことがある。


   while ( 条件式 ) {
     処理
   }



5-2-2.until⽂

最初に条件式を評価し、偽(FALSE)の間処理を繰り返す。1回⽬の条件式評価で TRUE だと⼀度も処理を実⾏しないことがある。


   until ( 条件式 ) {
     処理
   }




5-2-3.for⽂

個数のわかっている配列など、上限値の決まったデータに対する繰り返し処理で使うことが多い。


   for ( インデックス初期値; 条件式; インデックスのインクリメント等) {
     処理
   }
5-2-4.foreach⽂

特殊な繰り返し構⽂。配列の要素を⼀つ⼀つ取り出すのに使う。要素がなくなるまで繰り返す。


   foreach 要素 ( 配列 ) {
     処理
   }
5-2-5.do⽂


(1)do while 文

繰り返し処理ブロックの最後に条件式を判定し、真(TRUE)の間繰り返し処理実⾏する。初回1回は必ず処理を実⾏する。


    do {
      処理
    }while ( 条件式 );



(2)do until 文

繰り返し処理ブロックの最後に条件式を判定し、偽(FALSE)の間繰り返し処理実⾏する。初回1回は必ず処理を実⾏する。


    do {
      処理
    }until ( 条件式 );
5-2-6.繰り返し制御コマンド

(1)next:繰り返しの残りの処理を実行せずに、次の繰り返しの条件判定に移行する。


(2)continue:次の繰り返しい移⾏するまえに必ず実⾏するブロックを指定する(redo 時を除く)。


(3)last:繰り返しを直ちに抜ける。


(4)redo:繰り返しの残りの処理を実⾏せずに、次の繰り返し処理に移⾏する。条件判定は⾏わない。continue ブロックも実⾏しない。


(5)goto:指定のラベルの箇所までジャンプする。たいていは last, next にラベルを追加して使⽤。C ⾔語ユーザー対策。




繰り返し構⽂は複雑でめんどくさいです。使いながら覚えましょう!




                                                                        以上

Weitere ähnliche Inhalte

Was ist angesagt?

PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013Rui Hirokawa
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディングDaisuke Tasaki
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011Rui Hirokawa
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門y-uti
 
php7's ast
php7's astphp7's ast
php7's astdo_aki
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室Yusuke Ando
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回Joe_noh
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門Kazunori Tatsuki
 
PHPの今とこれから2021
PHPの今とこれから2021PHPの今とこれから2021
PHPの今とこれから2021Rui Hirokawa
 
PHP基本的関数QUIZ
PHP基本的関数QUIZPHP基本的関数QUIZ
PHP基本的関数QUIZWataru Terada
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 

Was ist angesagt? (20)

PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
php7's ast
php7's astphp7's ast
php7's ast
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
 
PHPの今とこれから2021
PHPの今とこれから2021PHPの今とこれから2021
PHPの今とこれから2021
 
PHP基本的関数QUIZ
PHP基本的関数QUIZPHP基本的関数QUIZ
PHP基本的関数QUIZ
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 

Andere mochten auch

アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城
アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城
アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城Rikie Ishii
 
Sctoyama(20141221)
Sctoyama(20141221)Sctoyama(20141221)
Sctoyama(20141221)真 岡本
 
Objective-C A Beginner's Dive
Objective-C A Beginner's DiveObjective-C A Beginner's Dive
Objective-C A Beginner's DiveAltece
 
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回 サイエンスリンケージデータベースの使い方
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回サイエンスリンケージデータベースの使い方SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回サイエンスリンケージデータベースの使い方
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回 サイエンスリンケージデータベースの使い方Yasushi Hara
 
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回Yasushi Hara
 
Ibusuki(20140106)
Ibusuki(20140106)Ibusuki(20140106)
Ibusuki(20140106)真 岡本
 
カオス・まびき法(テーマ設定法の一形態)
カオス・まびき法(テーマ設定法の一形態)カオス・まびき法(テーマ設定法の一形態)
カオス・まびき法(テーマ設定法の一形態)Rikie Ishii
 
Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)Kazuhito Ohkawa
 
Consulを頑張って理解する
Consulを頑張って理解するConsulを頑張って理解する
Consulを頑張って理解するMasakazu Watanabe
 

Andere mochten auch (11)

アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城
アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城
アイデアのつくり方(知財向けのTRIZワーク)2013年6月6日@宮城
 
Perl入学式 #1
Perl入学式 #1Perl入学式 #1
Perl入学式 #1
 
Sctoyama(20141221)
Sctoyama(20141221)Sctoyama(20141221)
Sctoyama(20141221)
 
Objective-C A Beginner's Dive
Objective-C A Beginner's DiveObjective-C A Beginner's Dive
Objective-C A Beginner's Dive
 
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回 サイエンスリンケージデータベースの使い方
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回サイエンスリンケージデータベースの使い方SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回サイエンスリンケージデータベースの使い方
SciREX「ナショナルイノベーションシステムに係る定量データとその分析手法」WSシリーズ第4回 サイエンスリンケージデータベースの使い方
 
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回
「データを使ってイノベーション分析をするためにデータベースの使い方をひと通り勉強してみる会(仮)」: 第一回
 
Ibusuki(20140106)
Ibusuki(20140106)Ibusuki(20140106)
Ibusuki(20140106)
 
カオス・まびき法(テーマ設定法の一形態)
カオス・まびき法(テーマ設定法の一形態)カオス・まびき法(テーマ設定法の一形態)
カオス・まびき法(テーマ設定法の一形態)
 
DDoS対策の自動化
DDoS対策の自動化DDoS対策の自動化
DDoS対策の自動化
 
Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)Nutanixを導入してみて思ったこと(仮)
Nutanixを導入してみて思ったこと(仮)
 
Consulを頑張って理解する
Consulを頑張って理解するConsulを頑張って理解する
Consulを頑張って理解する
 

Ähnlich wie Perl勉強会#2資料

モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia鉄次 尾形
 
20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話outerinside
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜ericsagnes
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプトbsdhack
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerlcharsbar
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由Yohei Azekatsu
 
Ruby紹介(pdf)
Ruby紹介(pdf)Ruby紹介(pdf)
Ruby紹介(pdf)Gohryuh
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)Masanori Machii
 

Ähnlich wie Perl勉強会#2資料 (20)

モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
Niigata.pm #1
Niigata.pm #1Niigata.pm #1
Niigata.pm #1
 
20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話20年越しで Perl 4 to 5 した話
20年越しで Perl 4 to 5 した話
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
Ilstudy001_20110806
Ilstudy001_20110806Ilstudy001_20110806
Ilstudy001_20110806
 
0x300
0x3000x300
0x300
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerl
 
私がPerlを使う理由
私がPerlを使う理由私がPerlを使う理由
私がPerlを使う理由
 
Ruby紹介(pdf)
Ruby紹介(pdf)Ruby紹介(pdf)
Ruby紹介(pdf)
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
WCO2012「PHP教室」
WCO2012「PHP教室」WCO2012「PHP教室」
WCO2012「PHP教室」
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 

Perl勉強会#2資料

  • 2. 1.はじめに 1­1.参考書 『プログラミングPerl〈VOLUME1〉 』http://www.amazon.co.jp/dp/4873110963 ※定価¥5565 『プログラミングPerl〈VOLUME2〉 』http://www.amazon.co.jp /dp/4873110971 ※定価¥4935 『初めての Perl 第 5 版』※定価¥3780 『続・初めての Perl 第 5 版』※定価¥3780 通称:ラクダ本 中規模以上向けのテクニック等、発展的内容 が多い。 通称:リャマ本(白リャマ&黒リャマ) 初心者向け。スクリプトの書き方から順を追っ て解説。
  • 3. 1­2.⾃学⽤Webサイト 本は買(いたくない|えない)という⼈は Web サイトでも可(なかなか体系だった知識が⾝につきにくいのが難点ですが)。 [Perl doc] http://perldoc.perl.org/ ※総本⼭ [Perl doc - ⽇本語化プロジェクト] http://perldoc.jp/ [(上記サイト)コア] http://perldoc.jp/index/core [(上記サイト)関数] http://perldoc.jp/index/function [(上記サイト)モジュール] http://perldoc.jp/index/module ※⼀部のみ [サンプルコードによる Perl ⼊⾨] http://d.hatena.ne.jp/perlcodesample/ [(上記サイト)Perl 基礎⽂法最速マスター] http://d.hatena.ne.jp/perlcodesample/20091226/1264257759 メールマガジンでは以下のようなものがあります。 [Perl で書く] http://archive.mag2.com/0000109251/index.html
  • 4. 1­3.Perlスクリプトの書き⽅と実⾏⽅法 (例)コマンドライン画⾯に'Hello World'と表⽰させるスクリプト 1-3-1.新しく ファイルを開く 1-3-2.スクリプトを書く(perlstudy2_000.pl) print "Hello Worldn"; print:画⾯に⽂字列を表⽰するためのコマンド ¥n:"¥"+n:⽂字列の最後で改⾏することを指⽰します ⽂の最後はセミコロン『;』で終わりましょう。 『#』以降はコメント⽂として無視されます。変数や関数の説明や、変更履歴などを書くと後で⼤変役に⽴ちます。 空⽩は半⾓スペースかタブ⽂字のみです。全⾓スペースが画⾯上に表⽰されるようにエディタに設定しておくとうっかりミスを防げます。
  • 6. 1-3-5.もっと簡単に実⾏する⽅法 (4)ではスクリプトを実⾏するのに Perl の実⾏コマンドに作成したスクリプトファイルを指定する必要がありましたが、ファイルそのものをスクリプトとして実⾏ する⽅法もあります(この⽅法で実⾏させることが多いです)。 スクリプトの"⼀⾏⽬"に以下のような⽂を追加してください(perlstudy2_001.pl)。 #!/usr/bin/perl : ⾏頭の『#!』は『シバン(shebang)』といい、起動してスクリプトを読み込むインタプリタを指定するコマンドです。 『#!』と後に続くインタプリタ(ここでは Perl)のパスとの間はスペースを開けないでください。 この⾏で Perl の実⾏ファイルの場所(パス)を指⽰します。以下のように調べることができます。 $> which perl /usr/bin/perl ※ここの⾏をコピペ
  • 7. (1) 実⾏ $> ./perlstudy2_001.pl -bash: ./perlstudy2_001.pl: Permission denied bash(使⽤しているシェルの名前)に"Permission denied(権限拒否)"と怒られてしまいました。 ファイル(perlstudy2_001.pl)にスクリプトとしてファイルを実⾏させる為の権限がないからです。 Linux などの多くの環境では、ファイルをスクリプトとして実⾏させるためにはファイルに実⾏権限を与えてやる必要があります(ファイル作成時に最初から実⾏ 権限を与えている環境もあるが、セキュリティ上の観点からないことの⽅が多い)。 (2) 実⾏権限の確認 $> ls -l perlstudy2_001.pl -rw-r--r-- ... ^ ここの部分に'x'があるとファイルの所有者の実⾏権限があるという意味になる ファイルの所有者(⾃分)に実⾏権限がありません。以下の⼿順でファイルに実⾏権限を与えてやります。
  • 8. (3) スクリプトファイルに実⾏権限を与える $> chmod u+x perlstudy2_001.pl ※ chmod:ファイルの実⾏権限を与えるコマンド(ファイル所有者が⾃分である場合のみ使⽤可) u+x:所有者(u)に実⾏権限(x)を与える(+)の意味 、 (4) 実⾏権限を確認 $> ls -l perlstudy2_001.pl -rwxr--r-- ... ^ ここの部分に'x'があるとファイルの所有者の実⾏権限があるという意味になる 実⾏権限があることが確認できたので Perl スクリプトを実⾏します。 (5) 再び実⾏ $> ./perlstudy2_001.pl Hello World $> (4)と同じ結果が出⼒されました。
  • 9. 1­4.⼊出⼒(標準⼊出⼒) ここでは画⾯やキーボードなどでデータをやり取りする⽅法を説明します。 1-4-1.標準⼊出⼒とは 標準⼊⼒(STDIN):キーボード 標準出⼒(STDOUT):画⾯(ディスプレイ) ※STDIN,STDOUT:スクリプト内で標準⼊出⼒を⽰す特殊変数 1-4-2.標準⼊⼒の⽅法 キーボードからデータを受け取るには以下のように行います。 $instr = <STDIN>; ※$in_str:⼊⼒したデータを格納する変数 ※<XXXXX>:ファイルハンドル XXXXX からデータを読み出す⾏⼊⼒演算⼦『<>』。ここでは標準⼊⼒ STDIN をファイルとみなしている。 【注意】 キーボードで改行を入力した所でデータが読み取られます。改行まで含まれます。キーボード入力値を使ってデータの操作を行う場合、末尾の改行コードを考慮し ないと予期しない結果が得られることがあります。
  • 10. 1-4-3.標準出⼒の⽅法 画⾯上へのデータの出⼒には print 関数を使います。(他にもいろいろありますがここでは割愛します) <使い⽅> print (出⼒させたい⽂字列や数値のリスト); 【使い⽅の例:perlstudy_print.pl】 #!/usr/bin/perl $str = "こんにちは"; $str2 = "コンニチハ"; $num = 3.14; print $str; print "nt => ⽂字列を出⼒n"; print $num; print "nt => 数値を出⼒n"; print "$str $num"; print "nt => ⽂字列と数値を同時に出⼒(ダブルクオテーションでくくると⽂字列として処理される)n"; print("⽂字列を"(ダブルクオテーション)でくくると変数や制御⽂字が展開されて出⼒されますn"); print("⽂字列変数「$str」や数値変数「$num」も""(ダブルクオテーション)内に埋め込んで出⼒することができます」n"); print "関数のかっこ()は省略することが可能ですn"; print '⽂字列を'でくくると改⾏コードや変数が展開されなくなりますn'; print "n ⽂の先頭や⽂の途中で改⾏することも可能です。n 改⾏n"; print "<発展>n";
  • 11. 【使い⽅の例(発展):perlstudy_print.pl】 print << "PRINT_DOCUMENT"; *** これは『ヒアドキュメント』という出⼒⽅法です。 print ⽂の代わりに変数に代⼊することも可能です。 改⾏もそのまま出⼒されます。 変数も展開されます($str) ヘルプメッセージなどの⽂章を出⼒するのに便利です。 *** PRINT_DOCUMENT 【実⾏例:perlstudy_print.pl】 $> ./perlstudy2_001.pl こんにちは => ⽂字列を出⼒ 3.14 => 数値を出⼒ こんにちは 3.14 => ⽂字列と数値を同時に出⼒(ダブルクオテーションでくくると⽂字列として処理される) ⽂字列を"(ダブルクオテーション)でくくると変数や制御⽂字が展開されて出⼒されます ⽂字列変数「こんにちは」や数値変数「3.14」も""(ダブルクオテーション)内に埋め込んで出⼒することができます」 関数のかっこ()は省略することが可能です ⽂字列を'でくくると改⾏コードや変数が展開されなくなりますn ⽂の先頭や⽂の途中で改⾏することも可能です。 改⾏ <発展> *** これは『ヒアドキュメント』という出⼒⽅法です。 print ⽂の代わりに変数に代⼊することも可能です。 改⾏もそのまま出⼒されます。 変数も展開されます(こんにちは) ヘルプメッセージなどの⽂章を出⼒するのに便利です。 ***
  • 13. 2.Perlでスクリプトを書くときに幸せになる3つの呪⽂ 2­1.『use strict』 簡単に⾔うと「好ましくない操作を⾏おうとするとエラーにしてくれる」呪⽂です。 下⼿にプログラムが動くと期待しない結果になった時に原因がわからなくなる時があります。詰みます。 追加のインストールは不要です。 以下ののオプションがあります。 『vars』my,our,use vars など、変数の有効範囲を指定した宣⾔をせずに変数を使おうとするとエラーを出⼒する 『refs』シンボリックリファレンスが使われた時にエラー出⼒する 『subs』サブルーチン以外の裸の識別⼦を使おうとした時にエラーを出⼒する 最初は『vars』以外は意識して使うことはないと思いますが、とりあえずスクリプト冒頭に「use strict;」と書いておけば OK です。何も指定しないと全てのオ プションを指定したのと同じ意味になります。
  • 14. 2-1-1.use strictがない場合 - varsの例(perlstudy2_100.pl) #!/usr/bin/perl $greeting = "Hello Worldn"; print "<⼀度⽬の挨拶>n"; print $greeting; # # (あれやこれや処理を書く) # # 最初に定義した$greeting 変数を使う # $greeting のつもりで$greetings とタイプミス print "<⼆度⽬の挨拶>n"; print $greetings; 【実⾏例】 <⼀度⽬の挨拶> Hello World <⼆度⽬の挨拶> ⼆度⽬の挨拶の出⼒では$greeting のつもりで$greetings とタイプミスしてしまったので何も出⼒されませんでした。これでは何がまずかったのかよくわかりませ ん。"use strict"を書いておくとこういうトラブルを防ぐことができます。
  • 15. 2-1-2.use strictがある場合 – varsの例(perlstudy2_101.pl) #!/usr/bin/perl use strict; my $greeting = "Hello Worldn"; #変数 $greeting の宣⾔(と⼀緒にデータをセット)。 print "<⼀度⽬の挨拶>n"; print $greeting; # # (あれやこれや処理を書く) # # 最初に定義した$greeting 変数を使う # $greeting のつもりで$greetings とタイプミス print "<⼆度⽬の挨拶>n"; print $greetings; #<<< line.21 【実⾏例】 <⼀度⽬の挨拶> Hello World <⼆度⽬の挨拶> Global symbol "$greetings" requires explicit package name at ./perlstudy2_101.pl line 21. Execution of ./perlstudy2_101.pl aborted due to compilation errors. use strict を指定しているのに、21 ⾏⽬の”$greetings”という変数が宣⾔されていない(宣⾔したつもりがタイプミス)ためにエラーが起こって実⾏が中断されて います。これにより、エラーの原因の⼿がかりを得ることができます(ここではエラーメッセージだけでは原因はよくわかりません)。 ※my:プログラムで使う変数を宣⾔するための予約語
  • 16. 2­2.『use warnings』 より詳しいエラーメッセージと共に、まずい使い⽅をしている箇所を警告してくれる呪⽂です。 warnings モジュールを CPAN でインストールする必要があります。 2-2-1.warningsインストール⽅法 ※要:管理者権限 $> sudo perl -MCPAN -e shell cpan> install warnings warnings がない場合(2-1-2:perlstudy2_101.pl)とある場合を⽐べてみましょう。
  • 17. 2-2-2.warningsがある場合(perlstudy2_102.pl) #!/usr/bin/perl use warnings; $greeting = "Hello Worldn"; print "<⼀度⽬の挨拶>n"; print $greeting; # # (あれやこれや処理を書く) # # 最初に定義した$greeting 変数を使う # $greeting のつもりで$greetings とタイプミス print "<⼆度⽬の挨拶>n"; print $greetings; # <<< line 16 【実⾏例】 Name "main::greetings" used only once: possible typo at ./perlstudy2_102.pl line 16. <⼀度⽬の挨拶> Hello World <⼆度⽬の挨拶> Use of uninitialized value $greetings in print at ./perlstudy2_102.pl line 16. 『16 ⾏⽬の greetings という変数が⼀度しか使われていない。typo では?』 『greetings という変数が初期化されてないのに使われてる。』 と怒られているのがわかります。このように "use strict"だけを指定した場合と⽐べても、より詳しいエラー内容が出⼒されていることがわかります。
  • 18. 2­3.『use utf8』 ソースコードで Unicode(UTF-8)を扱うことができるようになります。 指定がない場合、⽂字列が単なるバイト列として扱われ⽂字列の検索で不都合が起きる場合があります。 use utf8 がある場合とない場合の例は⽂字コードの深い話になってしまうのでここでは割愛します。使い⽅だけ⽰します(use strict, use warnings も併記)。 2-3-1.use utf8 の使い⽅(perlstudy2_103.pl) #!/usr/bin/perl use strict; use warnings; use utf8; #標準出⼒に使う⽂字コードを utf8 に設定する。 binmode STDOUT, ":encoding(utf8)"; #変数の宣⾔ my $greeting; $greeting = "Hello Worldn"; print "<⼀度⽬の挨拶>n"; print $greeting; # # (あれやこれや処理を書く) # # 最初に定義した$greeting 変数に別の挨拶を代⼊ $greeting = "こんにちはこんにちはn"; print "<⼆度⽬の挨拶>n"; print $greeting;
  • 19. 【演習】use utf8 の挙動確認 use utf8 がない場合の挙動を試してみる。binmode STDOUT...がない場合の挙動を試してみる。 2­4.use xxxxxって何?(補⾜) perl モジュール(ライブラリ)を読み込むためのコマンドです。 スクリプト起動時、他の処理を実⾏する前に読み込まれます。 CPAN から warnings や utf8 以外の様々な役割のモジュールをダウンロードすることができるので試してみてください。 [CPAN] http://www.cpan.org/ [CPAN ⽇本語サーチサイト] http://search.cpan.org/~dapm/perl-5.10.1/README.jp [CPAN モジュールガイド(書籍)] http://www.amazon.co.jp/dp/486267108X
  • 21. 3.変数 3­1.変数(名)とは何か 【⼀般的な概念:http://e-words.jp/w/E5A489E695B0.html】 プログラムのソースコード中で、データを⼀時的に記憶しておくための領域に固有の名前を付けたもの。変数につけた名前を変数名と呼び、記憶されてい るデータをその変数の値という。データの⼊れ物のような存在で、プログラム中で複数のデータを扱いたいときや、同じデータを何度も参照したり計算によ って変化させたい場合に利⽤する。 変数をプログラム中で利⽤するには、⾃分がこれからどんな変数を利⽤するかを宣⾔し、値を代⼊する必要がある(宣⾔が不要な⾔語や処理系もある)。変 数に格納された値を利⽤したいときは、変数名を使って参照する。多くの⾔語では、整数、実数、⽂字列など、変数に利⽤できるデータの種類(データ型)が 決まっており、宣⾔や代⼊の際にその変数がどのデータ型かを指定する必要がある。
  • 22. 3-1-1.Perlの変数 変数の宣⾔は必要ない。使いたい時に使える。※前述の use strict が指定されている場合は除く データ型を指定する必要はない。Perl が内部で使⽤⽤途に応じて判断する 【実⾏例:1-4-3.標準出⼒の⽅法(perlstudy_print.pl)】 浮動⼩数点(3.1415...)も整数(1, 2, 3...)も⽂字列(abc)も型指定することなく同じ変数に代⼊できる。 3-1-2.変数というものがないとどうなるか(余談) コンピュータの記憶領域の番地(数字)を指定し値を書き込み、参照するときはその番地を指定して読みだす必要がある。 コンピュータの構造(プロセッサ)によって記憶領域の番地の付け⽅が違うので、コンピュータ毎に番地を変えてプログラムを書く必要がある。 => ⾯倒、値がどういう種類のものかわかりにくい => 数値の番地に代わる名前(タグ)をつけて管理 => 変数(名) 【例:住所】[⼈] データ、[メモリの番地] 緯度経度、住所:変数名
  • 23. 3­2.変数の種類 3­2­1.単純変数(変数) ⼀つの値(リテラル値)を⼊れるための箱 同じ変数に続いて値を⼊れる(代⼊)と前の値は上書きされる 【書き⽅】 『$』に続いて変数名を記述する $varname = 1; #整数'1'を表す $varname = 1.56; #整数'1.56'を表す $varname = "abcde"; #⽂字列'abcde'を表す $varname = 'これは⽂字列ですn'; #⽂字列を表す変数(シングルクォーテーションで括る) $varname = "これは⽂字列ですn 改⾏"; #⽂字列を表す変数(ダブルクォーテーションで括る) ※変数に続いて 『=』で値を設定することを、 『変数の初期化』という。 ※⽂字列のシングルクォテーション『ʼ』とダブルクォーテーション『”』の違い => (see.) 1-4-3.標準出⼒の⽅法
  • 24. 3­2­2.単純配列(配列) 複数の値を 1 つの名称でグループ化して⼊れるための箱 特定の場所の値を取り出す(参照する)のに整数の値(添字、インデックス)を使う 同じ名称の配列の同じ添字に続いて値を⼊れると前の値は上書きされる。 配列の添字は 0 から始まる。 【書き⽅】 『@』に続いて配列名を記述する: <例1:添字で配列の場所を指定して値を代⼊(配列の初期化)> $+配列名+[(添字)]=XXX ※『[』:Bracket $arrname[0] = 1; $arrname[1] = 2; $arrname[2] = 3; <例2:リストで配列を初期化> @+配列名 = (リスト) @arrname = (1, 2, 3); ※リスト:値のをカンマ区切りの丸括弧『()』でくくったもの。値の集合。
  • 25. 3­2­3.連想配列(ハッシュ) 連想配列の添字(キー)を単純配列のように連続する数値でなく任意の⽂字列で表したもの 特定の場所の値を取り出すのに値を代⼊する時に使った⽂字列を使う。 【書き⽅】 『%』に続いて配列名を記述する: <例1:添字で配列の場所を指定して値を代⼊(配列の初期化)> $+配列名+{(添字)}=XXX ※『{』 :Curly Blacket $hashname{apple} = 'red'; $hashname{lemon} = 'yellow'; $hashname{'Apple'} = 'Red'; $hashname{'Lemon'} = 'Yellow'; $hashname{"_Apple"} = '_Red'; $hashname{"_Lemon"} = '_Yellow'; <例2:リストで配列を初期化> @+配列名 = (リスト) %hashname = ('apple','red','lemon','yellow','Apple','Red','Lemon','Yellow','_apple','_red','_lemon','_yellow'); ※リストの先頭から順に、Key1, Value1, Key2, Value2...と解釈されて配列が初期化される。 <例3:リストで配列を初期化(その2)>
  • 26. @+配列名 = (リスト) %hashname = ('apple'=>'red','lemon'=>'yellow','Apple'=>'Red','Lemon'=>'Yellow','_apple'=>'_red','_lemon'=>'_yellow'); 3­2­4.変数名(配列名)のお約束 1 ⽂字⽬は必ず英字(a_zA_z)またはアンダースコア(_)で始まる 2 ⽂字⽬以降は英数字(a-zA-z0-9)またはアンダースコア(_)でも可 例)【OK】$a, $abc, $a01, $a01_23, 【NG】$123 ⼤⽂字と⼩⽂字は区別される 変数名の⻑さの制限はない 同じ名称で変数($)、単純配列(@)、連想配列(%)は別の変数として扱われる。 例)$name, @name, %name は別の変数
  • 27. 3­3.変数の型 C ⾔語で⾔うところの整数、浮動⼩数点、⽂字列のような型の定義はありません。 3­4.特殊変数(配列) 宣⾔しなくても Perl のスクリプトを実⾏した時に環境に応じた何らかの値が⼊っている変数(配列) 。前に出た、標準⼊出⼒(STDIN、STDOUT)など。 (1) 正規表現に関連する特殊変数 (2) ファイルハンドル毎の特殊変数 (3) グローバルな特殊変数 (4) グローバルな特殊配列 (5) グローバルな特殊ファイルハンドル http://wiki.stsd.info/perl/54m55q6K5aSJ5pWw5LiA6Kan.html http://d.hatena.ne.jp/gnjdg6457/20110202/p1
  • 28. 3­5.その他変数の説明でよく出てくる⽤語の説明 『スカラー』 ・リスト(配列)などではなく数値や⽂字列など単純な値のこと。 『リスト』 ・値(スカラー)の集合。 ・値をカンマ区切りの丸括弧『()』でくくったもの。 ・変数として名前が付けられていないものを『無名リスト』ともいう。 ・名前付きリストのことを連想配列(ハッシュ)という。s 『リテラル(literal)』 ・literally(⽂字通り)に由来 ・変数を介してではなく数値や⽂字列など値そのものを指す
  • 30. 4.演算⼦ 4­1.演算⼦の種類 算術演算⼦:加減剰余(+, -, *, /), 余り(%), べき乗(**), ++(インクリメント), --(デクリメント) 代⼊演算⼦:単なる代⼊(=), 計算結果を代⼊(+=, *=, -=, /=, **=, %=), ⽂字列を連結して代⼊(.=) ビット演算⼦:論理和(|), 論理積(&), ~(否定), 右ビットシフト(>>), 左ビットシフト(<<) ⽐較演算⼦:数値⽐較(<, >, <=, >=), 数値等価(==), 数値不等価(!=), ⽂字列等価(eq), ⽂字列不等価(ne),⽂字列⼤⼩⽐較(le, ge, lt, gt) 論理演算⼦:NOT, AND, OR, XOR 条件演算⼦:条件分岐の中で使われる演算⼦(&&, ||) など他にもたくさん。 http://perldoc.jp/docs/perl/5.6.1/perlop.pod
  • 31. 4­2.演算⼦の優先順位と結合性 http://perldoc.jp/docs/perl/5.14.1/perlop.pod#Operator32Precedence32and32Associativity 4-2-1.演算⼦の優先順位 【例】2+4*5 演算⼦の優先順位 とは、他の演算⼦より先に評価される演算⼦が あるということです。 例えば、2 + 4 * 5 の場合、乗算が⾼い優先順位を持っているの で、 4 * 5 が先に評価され、結果は 6 * 5 == 30 ではなく、 2 + 20 == 22 となります。 乗算『*』は加算『+』より優先順位が⾼い演算⼦なので、上の式は、2 + (4 * 5)のようにかっこの中から計算されます。 もし、優先順位の低い演算⼦から計算したい場合は、(2+4)*5 のようにかっこでくくりましょう。 不安なときはかっこでくくると間違いが少ないです。 4-2-1.演算⼦の結合性 【例】8-4-2 演算⼦の結合性 は、同じ演算⼦が連続して現れた場合に何が起こるかを 定義します: 評価器が左側を先に評価するか右側を先に評価するかです。 例えば、 8 - 4 - 2 の場合、減算は左結合なので、Perl は式を左から 右に評価します。 8 - 4 が先に評価されるので、8 - 2 == 6 ではなく 4 - 2 == 2 とな ります。 減算『-』の結合性は『左結合』、よって、同じ演算⼦が連続する四季の場合は左側から計算が⾏われます。 よって上の式は、(8 - 4) - 2 のようにかっこのついた側から計算されていきます。
  • 32. 5.制御構⽂ 5-1..条件⽂ 5-1-1.if⽂ 条件式が TRUE の場合に処理を実行します。 if (条件式 1) { 処理1 } elsif (条件式2) { 処理2 } elsif (条件式3) { 処理3 } else { 条件1〜3がいずれも偽(FALSE)の場合に実⾏される処理 } 処理が⼀⾏で終わる場合でもブラケット『{}』は省略することができません。 else if でも elseif でもなく『elsif』なので注意。 5-1-2.unless⽂ 条件式が FALSE の場合に処理を実行します。 unless (条件式) { 処理 }else{ 条件式が真(TRUE)の場合に実⾏される処理 } 処理が⼀⾏で終わる場合でもブラケット『{}』は省略することができません。 if ⽂と異なり elsif に相当する式は存在しません。
  • 33. if ⽂の条件式を否定『!』すれば if ⽂でも書けるので、最初のうちは使わないほうがよいかもしれません。 5-1-3.switch, select ⽂に相当する構⽂ 標準では存在しません。地道に if ⽂で実装しましょう。 ただし、CPAN で Switch モジュールをインストールすれば Switch 構⽂が使えるらしいです。 http://search.cpan.org/~rgarcia/Switch-2.16/Switch.pm 【Switch モジュールの例】 use Switch; switch ($val) { case 1 { print "number 1" } case "a" { print "string a" } case [1..10,42] { print "number in list" } case (@array) { print "number in list" } case /w+/ { print "pattern" } case qr/w+/ { print "pattern" } case (%hash) { print "entry in hash" } case (&sub) { print "arg to subroutine" } else { print "previous case not true" } }
  • 34. 5-2.繰り返し⽂ 5-2-1.while⽂ 最初に条件式を評価し、真(TRUE)の間処理を繰り返す。1回⽬の条件式評価で FALSE だと⼀度も処理を実⾏しないことがある。 while ( 条件式 ) { 処理 } 5-2-2.until⽂ 最初に条件式を評価し、偽(FALSE)の間処理を繰り返す。1回⽬の条件式評価で TRUE だと⼀度も処理を実⾏しないことがある。 until ( 条件式 ) { 処理 } 5-2-3.for⽂ 個数のわかっている配列など、上限値の決まったデータに対する繰り返し処理で使うことが多い。 for ( インデックス初期値; 条件式; インデックスのインクリメント等) { 処理 }
  • 36. 5-2-5.do⽂ (1)do while 文 繰り返し処理ブロックの最後に条件式を判定し、真(TRUE)の間繰り返し処理実⾏する。初回1回は必ず処理を実⾏する。 do { 処理 }while ( 条件式 ); (2)do until 文 繰り返し処理ブロックの最後に条件式を判定し、偽(FALSE)の間繰り返し処理実⾏する。初回1回は必ず処理を実⾏する。 do { 処理 }until ( 条件式 );
  • 37. 5-2-6.繰り返し制御コマンド (1)next:繰り返しの残りの処理を実行せずに、次の繰り返しの条件判定に移行する。 (2)continue:次の繰り返しい移⾏するまえに必ず実⾏するブロックを指定する(redo 時を除く)。 (3)last:繰り返しを直ちに抜ける。 (4)redo:繰り返しの残りの処理を実⾏せずに、次の繰り返し処理に移⾏する。条件判定は⾏わない。continue ブロックも実⾏しない。 (5)goto:指定のラベルの箇所までジャンプする。たいていは last, next にラベルを追加して使⽤。C ⾔語ユーザー対策。 繰り返し構⽂は複雑でめんどくさいです。使いながら覚えましょう! 以上