スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
君のプログラムスタイルを抜本的に変える方法
今から、Perlについてとても大切なことを書く。
これを理解すれば、Perl中級をいっきにぶっとばして
上級クラスの仲間入りをすることができる。

まずは、Perlの関数への引数の渡し方をみよう。

sub f {
 my ($c, $d, $e) = @_;

 print "1: $c" . "\n";
 print "2: $d" . "\n";
 print "3: $e" . "\n";
}

my $x = 10;
my $y = 9;
my $z = 8;

f($x, $y, $z);

実に簡単な例だ。
これは実によくできている。
結果:
1: 10
2: 9
3: 8


では、次のように配列を渡すとどうなるだろう?
sub f {
 my ($c, $d, @e) = @_;

 print "1: $c" . "\n";
 print "2: $d" . "\n";
 print "3: @e" . "\n";
}

$x = 10;
$y = 9;
@z = (8,7,6);

f($x, $y, @z);

よかった!うまくいった!!
結果:
1: 10
2: 9
3: 8 7 6

気分をよくしたので、もうひとつ引数を渡してみることにしよう。
sub f {
 my ($c, $d, @e, $f) = @_;

 print "1: $c" . "\n";
 print "2: $d" . "\n";
 print "3: @e" . "\n";
 print "4: $f" . "\n";
}

$x = 10;
$y = 9;
@z = (8,7,6);
$w = 5;

f($x, $y, @z, $w);

なんてこった!!
@e に、$w をかっさわれてしまった!!
結果:
1: 10
2: 9
3: 8 7 6 5
4:  

どうすればいいんだと、頭をかかえて
1週間を過ごすかわりに次のようにしてみるといい。

sub f {
 my ($c, $d, $e, $f) = @_;

 print "1: $c" . "\n";
 print "2: $d" . "\n";
 print "3: @$e" . "\n";
 print "4: $f" . "\n";
}

$x = 10;
$y = 9;
@z = (8,7,6);
$w = 5;

f($x, $y, \@z, $w);

結果:
1: 10
2: 9
3: 8 7 6
4: 5

リファレンス渡しにしてあげればいいんだ。
リファレンスってのは、変数を指し示すスカラーなモノなんだ。
スカラーっていうのは、「ただひとつ」って意味。

$ref = \@c

とすれば、配列というたくさん値を持ったモノを、
ただひとつの変数、$ref で持てるんだ! こりゃユカイ!!


ここで、関数がハッシュを受け取ることを考える。
ハッシュも配列と同じで、たくさんの値を持っているので、
さっきみたいに、かっさわれないようにリファレンス渡しにしてやる必要がある。

さあ、「18以上じゃないとダメ」と大人な返事をする関数を作ってみよう。
※とりあえず、第2引数は与えるものが思いつかなかったので顔文字にしておいた。

sub f {
 my ($c, $d) = @_;

 if( $$c{'age'} >= 18 ){
   print "18歳以上なのでOK $d";
 }else{
   print "君にはまだ早いよぉ $d";
 }
}

my $x = '(^_^)';
%y = ( 'age' => 18 );

f(\%y, $x);

結果:
18歳以上なのでOK (^_^)


さて、なんでこんな例を出したんだろう?
あ、そうだ、次のことを言いたかったからなんだ。
18歳以上じゃないとできないことがある.....

ではなくて、

ハッシュをもらってそのキーと値から関数の挙動を変える
ということをしているCPANモジュールが結構存在するんだ。

そこで、さっきみたいにこんなソースを書くことになるだろう。

sub f {
 my ($c) = @_;

 if( $$c{'flag'} == 1 ){
   print "OK";
 }else{
   print "NG";
 }
}

my %c = ( 'flag' => 1 );
f(\%c);


ナンセンス!!!!!!!
その%cって本当に必要なの??

その変数名を考えるのに時間と脳細胞を無駄にしてませんか???

また、あとでソースを読むときも、
短期記憶に覚えておかないといけない変数名が増えてしまいます。
これくらいのソースならいいが1万行からなるソースを読むときだと考えたらどうだろう??

それだけじゃない、%cがソースの中でどこで使われてるか調査する必要があって、
このf(\%c)ってところ1カ所だけだったとわかったときの、俺の作業時間っていったい.... って気持ちがわかる??
はは、調査なんて grep すればいいじゃないかぁ! だって??
スコープが違えば、同じ名前を使っても問題ないんじゃなかったけ!??

この書き方は、
目玉焼きを作るのに、卵を割っていきなりフライパンに入れずに、
一度、容器に入れてから慎重にフライパンに移すようなものなんだ!!
そんな無駄なことする人っている???

いきなりフライパンに入れてしまえばいいんだ!
こんな風にね。
sub f {
 my ($c) = @_;

 if( $$c{'flag'} == 1 ){
   print "OK";
 }else{
   print "NG";
 }
}

f({'flag'=>1});


これは、ハッシュに名前をつけてないから、
無名ハッシュって呼ばれる方法なんだ。
この無名ハッシュはリファレンスなんだ。
だから、使い捨ての変数を用意する必要なんていらなんいんだ。
他にも、Perlでは、
無名配列に、無名関数を使えるんだ!

この無名シリーズを使えるようになると、
今までのプログラムスタイルはなんだったんだと思えるぐらい
革命的なソースが書けるようになるぞ。


無名関数については、
つぎの資料がよい。
君のプログラミング言語で、これ、できる?

リンク先はJavaScriptでの例ですが、そうです。同じように、Perlでも可能なのです。
スポンサーサイト
コメントを投稿する
Name:
URL:
Comment:

秘密:管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事にトラックバックする(FC2ブログユーザー)
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

06 | 2018/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。