第18回 その場で実行! すぐやれ!

今回は、「無名シリーズを作ってその場で実行」 というのをみていきたいと思います。
いままで、無名シリーズは、

my $c = [1,'b'];
my $d = {'a'=>'A', 'b'=>'B'};
my $e = sub { print "無名\n"; };

といったように、いったん、変数にそのリファレンスを代入しています。
しかし、変数に代入することなく、「作った瞬間に」使うことができます。

この手法は、なんかやろうとするとすぐグローバル空間(この言い方でいいのでしょうか?)を汚染してしまうJavaScriptで、

汚染を避けるため、 無名関数を「作ったその場ですぐ実行する」というやりかたでよく使われています。


JavaScriptの無名関数を作ったその場で実行の例:

(function(){
  console.log('無名をその場で実行! JavaScript版');
})();

結果:

無名をその場で実行! JavaScript版


つまり、こういうことです。


ん〜 まだむずかしい、という方のために、一度変数に入れるバージョンも書いておきましょう。

hoge = function(){ console.log('一度、変数にいれてから、こんにちは'); };
(hoge)();

結果:

一度、変数にいれてから、こんにちは


function(){} を囲っている( ) は、

c = (5+5)*2

のような( ) と考えてよいでしょう。



ささ、JavaScriptはこのくらいにしておきまして、Perlをみていきましょう。

まずは、変数にリファレンスを代入する方法から、おさらいとして見ておきましょう。

use strict;

my $c = [1,'b'];
my $d = {'a'=>'A', 'b'=>'B'};
my $e = sub { print "無名\n"; };

print "$c->[0]"   , "\n";  # 0番目の要素を取得
print "$d->{'a'}" , "\n";  # キーが'a'のものを取得

$e->();  # eが指している関数を実行

結果:

1
A
無名


それでは、「作ったその場ですぐ実行する」です。

use strict;

my $c = [1,'b']->[0];    # 0番目の要素を取得
my $d = {'a'=>'A', 'b'=>'B'}->{'a'};  # キーが'a'のものを取得

print "$c", "\n";
print "$d", "\n";

sub { print "無名\n"; }->();  # 無名関数をその場で実行

結果:

1
A
無名

簡単ですね。


の形ですね。
JavaScriptと違って ( ) で囲う必要はありません。


さて、ちょっと言葉遊び的(文法遊び的?)な方法なんですが、
「作ったその場ですぐ実行する」ができると、無名シリーズにさらに精通した気ができます。




それでは、
参考資料として、
ビンゴ中西のほげほげ君のソースから わずらわしい if elsif を消す方法
をあげておきます。


リンク先で、「作ったその場ですぐ実行する」を行っているのが、

use strict;

my $test = 'tanaka';

my $name = ({
             'nakanishi' => '中西',
             'tanaka'    => '田中',
             'suzuki'    => '鈴木'
           })->{$test};

print $name . "\n";

の部分です。 (※ 無名ハッシュを({ }) とカッコで囲っちゃってますが...)


このように無名をその場で実行は実践で役に立つときがあるかもしれません (※ ソースの読みやすさも考慮する必要があります) 。




では、また〜