|
はじめまして。正規表現たんです。
普段は長いことしゃべるのが苦手で口数が少ないほうなんですが、がんばってご説明しま
すのでなんとか理解してください。ごめんなさい。
サブルーチン
命令という言葉
(ここは重要ではありません)
ところで「命令」という日本語なのですが、日常使うのとプログラミングで使うのとは少
しニュアンスが違います。
プログラミングで言う「命令」とは意味がせまくて、「繰り返しなさい」とか「書き込み
なさい」みたいな小さくて単純な部分を指すことが多いです。
複雑なことをする部分は「命令をする」とは言わずに「関数を使う」とか「サブルーチン
に渡す」とか「モジュールに投げる」そして、「命令どおりに動いた」とは言わずに「結
果が返ってきた」とか言う場合が多いです。使う、渡す、投げる、は同じ意味です。
返ってくるは「真になる」「偽になる」「trueになる」「falseになる」みたいな言い方
をすることもあります。
日常会話的には「命令してやらせた」というところを、プログラミング的には「関数に渡
したら真を返した」なんて言い方になります。
慣れないうちはこういう言葉の違いのせいで理解しにくいところもあるかもですが、なん
とか頑張ってください。
なぜこんなことになってしまったかというと、人間的には「ナニかせよ」という命令が単純に
思えても、コンピューター的には連携した複数の動作の集合体となっている場合があり、
この動作の複合体のことを「関数」や「サブルーチン」、「モジュール」などと名づけら
れているために、コンピューター的に単純な命令と複雑な命令とを「命令する」とか「関数
を使う」なんて呼び分けているのです。
関数やサブルーチン、モジュールっていろいろ呼び方はありますが、全部「使いまわしす
る為の小さなプログラム」という同じ意味です。
これらはあらかじめ言語によってある程度用意されていますが、こんなのがあれば良いの
になと思ったら自分で作ることもできます。
サブルーチンの作り方
ではまずサブルーチンの作り方です。
サブルーチンとはプログラムの中の良く使う部品をひとまとめにしたものです。
ひとまとめにしておく時には名前をつけておきます。
そうすることによって、以後その名前を呼ぶことによってまとめておいた一連の動作をい
っぺんにやらせることができるようになる仕組みです。
まずは簡単な例から見てみましょう。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
&serifu;
sub serifu {
print "すべては<br>";
print "コミックマーケット<br>";
print "のために<br>";
}
↓
すべては
コミックマーケット
のために
|
この例では、
sub serifu {
print "すべては<br>";
print "コミックマーケット<br>";
print "のために<br>";
}
の部分がサブルーチンです。
サブルーチンは sub 名前 {実行内容} の形式で書きます。
名前は好きに付けてよく、実行内容は何行あってもかまいません。{} の後ろに ; はいりません。
このサブルーチンの内容を実行するには頭に & をつけて記述するだけです。上の例で
は &serifu と書くだけで {} の中身がいっぺんに実行されます。
例のように短いプログラムではサブルーチンを使う意味は無いのですが、長いプログラ
ムで共通する処理をさせたいときなどにありがたみが出てきます。
まず単純にプログラムを書く手間が省けますし、変更があった場合でもその1箇所を直
すだけで済みます。
サブルーチンを書く場所は何処でもかまいませんが、プログラム中のどこかにまとめて
おいたほうが後々見やすいと思います。私は後ろのほうにまとめて書くことが多いです。
引数
サブルーチンには引数(ひきすう)という値を渡すことも出来ます。
まずは例を見てください。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
&tasizan(1,2);
sub tasizan {
my ($x, $y) = @_;
print "$x + $y = ";
print $x + $y;
}
↓
1 + 2 = 3
|
サブルーチンを実行する時に &tasizan(1,2) というふうに
カッコの中にカンマで仕切った値を入れておくとサブルーチンの中でその値を使うことが
できるようになります。
値が数字ではなく文字列のときには '' や "" でくくります。
値には変数や式も使えます。
@_ (アッドアンダーバー)はサブルーチンに渡された値の入っている配列です。
これは自動的に発生する配列変数でPerlのお約束ごとです。
上の例では my ($x, $y) = @_; と書いて自分が分かり
やすいように名づけた変数で受けとりましたが、@_ の要
素である $_[0], $_[1] をその
まま使うことも出来ます。ただし、サブルーチンの中で他に @_ や $_ を使用する処理が
挟まることもあるかもしれないので、任意の変数に渡しておくほうが無難です。
my ($x, $y) = @_; は my $x = $_[0];
my $y = $_[1]; と書いても同じです。
また shift(左から順番に切り取る) を使って
my $x = shift @_; my $y = shift @_; と書くこともで
きますし、@_ は省略もできる透明の変数なので my $x = shift;
my $y = shift; と書いてもかまいません。
注意すべきことは @_ を配列変数で受け取る時です。@_ は my @x = @_; というように
して配列で受け取ることも出来ます。また、my($x, @y) = @_ とすることもできます。こ
のときは1つめの値が $x に、残り全てが $y に代入されます。
しかし、my (@x, $y) = @_; はいけません。こうすると @x の中に @_ の内容がすべて
代入されてしまい、$y の中には何も代入されてしまいません。
このように、受ける側に配列変数が混じるとその配列が残り全てを食べつくしてしまう
ので、変数と配列を混在させて受けたい時には配列を最後に持ってくるようにしましょう。
以上のことを無理やり盛り込んだ例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
my $x = 3;
my $y = 4;
&serifu('世界一',$x,$x+$y,'ィ','イ','!');
sub serifu {
my $x = shift;
my ($y, $z, @aa) = @_;
print "$x";
print $aa[0] x $z;
print $aa[1] x $y;
print $aa[2];
}
↓
世界一ィィィィィィィイイイ!
|
複数の配列を引数に盛り込む例、
配列を渡すにはリファレンスを使います。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
my @x = (1,2,3,4,5);
my %y = ('ボクタマ'=>'僕の地球を救って','マリミテ'=>'マリア様がみてる');
&hairetu(\@x, \%y);
sub hairetu {
my ($x, $y) = @_;
print "$x<br>";
print "@$x<br>";
print "$x->[0]<br>";
print "$y->{'ボクタマ'}";
}
↓
ARRAY(0x275ca8)
1 2 3 4 5
1
僕の地球を救って
|
戻り値
サブルーチンには戻り値という値を返すことができます。
サブルーチンの最後に return と書いてその後に値を書くとサブルーチンの値となりま
す。これを使うとサブルーチンを変数のように扱うことが出来ます。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
print &nanika;
sub nanika {
return 'シミ付きアニメTシャツ ';
}
↓
シミ付きアニメTシャツ
|
意味不明なプログラムですが、return で値を返すことが出来るというのは
ご理解いただけたでしょうか。
では、以上のことをまとめておさらいします。
メールアドレスをチェックする簡単な例。
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
print "メアドを教えてください<br>";
my $meado = 'test@email.ex';
print $meado . '<br>';
if (&email_chk($meado)){print "俺に惚れるなよ"}
else {print "(´д`)うそ"};
sub email_chk {
my $address = shift;
return undef
unless $address =~ /^[\w\.\-]+[a-zA-Z0-9]\@[\w\.\-]+\.[a-z]+$/o;
1;
}
↓
メアドを教えてください
test@email.ex
俺に惚れるなよ
|
{}の中は別世界
今までの例で $x や $y がサブルーチンの中と外で2回宣言されたりしてましたが、こ
れは同じ名前でも全く別物扱いされます。
サブルーチン {} の中で my を使って宣言された変数は {} の外には影響を与えません。
反対に my で宣言するまでは外からの影響を受けます。
例、
#!c:/perl/bin/perl
print "Content-type: text/html; charset=Shift_JIS\n\n";
my $x = 'ATフィールド';
&hoge;
print "$x<br>";
sub hoge{
print "$x<br>";
my $x = '心の壁';
print "$x<br>";
}
↓
ATフィールド
心の壁
ATフィールド
|
|
|
|
|