Más contenido relacionado La actualidad más candente (20) Similar a Perl勉強会#2資料 (20) Perl勉強会#2資料3. 12.⾃学⽤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
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)と同じ結果が出⼒されました。
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 ⽂の代わりに変数に代⼊することも可能です。
改⾏もそのまま出⼒されます。
変数も展開されます(こんにちは)
ヘルプメッセージなどの⽂章を出⼒するのに便利です。
***
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:プログラムで使う変数を宣⾔するための予約語
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. 23.『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...がない場合の挙動を試してみる。
24.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.変数
31.変数(名)とは何か
【⼀般的な概念: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.変数というものがないとどうなるか(余談)
コンピュータの記憶領域の番地(数字)を指定し値を書き込み、参照するときはその番地を指定して読みだす必要がある。
コンピュータの構造(プロセッサ)によって記憶領域の番地の付け⽅が違うので、コンピュータ毎に番地を変えてプログラムを書く必要がある。
=> ⾯倒、値がどういう種類のものかわかりにくい => 数値の番地に代わる名前(タグ)をつけて管理 => 変数(名)
【例:住所】[⼈] データ、[メモリの番地] 緯度経度、住所:変数名
24. 322.単純配列(配列)
複数の値を 1 つの名称でグループ化して⼊れるための箱
特定の場所の値を取り出す(参照する)のに整数の値(添字、インデックス)を使う
同じ名称の配列の同じ添字に続いて値を⼊れると前の値は上書きされる。
配列の添字は 0 から始まる。
【書き⽅】
『@』に続いて配列名を記述する:
<例1:添字で配列の場所を指定して値を代⼊(配列の初期化)>
$+配列名+[(添字)]=XXX ※『[』:Bracket
$arrname[0] = 1;
$arrname[1] = 2;
$arrname[2] = 3;
<例2:リストで配列を初期化>
@+配列名 = (リスト)
@arrname = (1, 2, 3);
※リスト:値のをカンマ区切りの丸括弧『()』でくくったもの。値の集合。
25. 323.連想配列(ハッシュ)
連想配列の添字(キー)を単純配列のように連続する数値でなく任意の⽂字列で表したもの
特定の場所の値を取り出すのに値を代⼊する時に使った⽂字列を使う。
【書き⽅】
『%』に続いて配列名を記述する:
<例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');
324.変数名(配列名)のお約束
1 ⽂字⽬は必ず英字(a_zA_z)またはアンダースコア(_)で始まる
2 ⽂字⽬以降は英数字(a-zA-z0-9)またはアンダースコア(_)でも可
例)【OK】$a, $abc, $a01, $a01_23, 【NG】$123
⼤⽂字と⼩⽂字は区別される
変数名の⻑さの制限はない
同じ名称で変数($)、単純配列(@)、連想配列(%)は別の変数として扱われる。
例)$name, @name, %name は別の変数
27. 33.変数の型
C ⾔語で⾔うところの整数、浮動⼩数点、⽂字列のような型の定義はありません。
34.特殊変数(配列)
宣⾔しなくても Perl のスクリプトを実⾏した時に環境に応じた何らかの値が⼊っている変数(配列)
。前に出た、標準⼊出⼒(STDIN、STDOUT)など。
(1) 正規表現に関連する特殊変数
(2) ファイルハンドル毎の特殊変数
(3) グローバルな特殊変数
(4) グローバルな特殊配列
(5) グローバルな特殊ファイルハンドル
http://wiki.stsd.info/perl/54m55q6K5aSJ5pWw5LiA6Kan.html
http://d.hatena.ne.jp/gnjdg6457/20110202/p1
28. 35.その他変数の説明でよく出てくる⽤語の説明
『スカラー』
・リスト(配列)などではなく数値や⽂字列など単純な値のこと。
『リスト』
・値(スカラー)の集合。
・値をカンマ区切りの丸括弧『()』でくくったもの。
・変数として名前が付けられていないものを『無名リスト』ともいう。
・名前付きリストのことを連想配列(ハッシュ)という。s
『リテラル(literal)』
・literally(⽂字通り)に由来
・変数を介してではなく数値や⽂字列など値そのものを指す
30. 4.演算⼦
41.演算⼦の種類
算術演算⼦:加減剰余(+, -, *, /), 余り(%), べき乗(**), ++(インクリメント), --(デクリメント)
代⼊演算⼦:単なる代⼊(=), 計算結果を代⼊(+=, *=, -=, /=, **=, %=), ⽂字列を連結して代⼊(.=)
ビット演算⼦:論理和(|), 論理積(&), ~(否定), 右ビットシフト(>>), 左ビットシフト(<<)
⽐較演算⼦:数値⽐較(<, >, <=, >=), 数値等価(==), 数値不等価(!=), ⽂字列等価(eq), ⽂字列不等価(ne),⽂字列⼤⼩⽐較(le, ge, lt, gt)
論理演算⼦:NOT, AND, OR, XOR
条件演算⼦:条件分岐の中で使われる演算⼦(&&, ||)
など他にもたくさん。
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
31. 42.演算⼦の優先順位と結合性
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" }
}