SlideShare a Scribd company logo
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 ⾔語ユーザー対策。




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




                                                                        以上

More Related Content

PPTX
詳説ぺちぺち
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PDF
PHPの今とこれから2014
PDF
ちょっと詳しくJavaScript 第3回【prototype】
PPTX
PHP AST 徹底解説
PDF
JavaScript超入門 基礎
PDF
Kanazawa.js.Next
PDF
I phoneアプリ入門 第5回
詳説ぺちぺち
PHP5.5新機能「ジェネレータ」初心者入門
PHPの今とこれから2014
ちょっと詳しくJavaScript 第3回【prototype】
PHP AST 徹底解説
JavaScript超入門 基礎
Kanazawa.js.Next
I phoneアプリ入門 第5回

What's hot (20)

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

Viewers also liked (11)

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

Similar to Perl勉強会#2資料 (20)

PPTX
ゼロからプログラミング講座(Perl) #1 @越谷 講義ノート
PPT
20130725 perl beginners_9
KEY
20年越しで Perl 4 to 5 した話
PPTX
ゼロからプログラミング講座(Perl) #2 @越谷 講義ノート
PPTX
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
PDF
正規表現勉強会入門
PDF
「Perl怖い」 In Chiba.pm #3
PDF
Write good parser in perl
PDF
about Perl5.10
PDF
Perl6で遊ぼう
PPTX
私がPerlを使う理由
PPT
2017年夏のPerl
PPTX
Perl logging
PDF
初めてのPerl
PPT
2018年夏のPerl5
PPT
正規表現のススメ_20091217
PDF
Perl入学式をやってみた! - YAPC::Asia 2012
KEY
WCO2012「PHP教室」
PDF
Perl io layer
PDF
大ざっぱにオブジェクト指向
ゼロからプログラミング講座(Perl) #1 @越谷 講義ノート
20130725 perl beginners_9
20年越しで Perl 4 to 5 した話
ゼロからプログラミング講座(Perl) #2 @越谷 講義ノート
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
正規表現勉強会入門
「Perl怖い」 In Chiba.pm #3
Write good parser in perl
about Perl5.10
Perl6で遊ぼう
私がPerlを使う理由
2017年夏のPerl
Perl logging
初めてのPerl
2018年夏のPerl5
正規表現のススメ_20091217
Perl入学式をやってみた! - YAPC::Asia 2012
WCO2012「PHP教室」
Perl io layer
大ざっぱにオブジェクト指向

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 ⾔語ユーザー対策。 繰り返し構⽂は複雑でめんどくさいです。使いながら覚えましょう! 以上