@nqounetです。

リファレンスは難しい、とかよく言われるのですが、それって突然出てくるから難しいのかな、と思っています。

それならば、最初からリファレンスで覚えてしまえば抵抗ないんじゃないかなと。

そもそもデリファレンスがややこしい

プログラミングでのリファレンス(日本語で言えば「参照」)という概念はPerlだけじゃありません。

では何故Perlのリファレンスだけが難しいというふうに言われるのか。

コレまで聞いている中では、デリファレンス(参照先を照会すること)が難しいというか、直感的ではないようです。

まずは「デリファレンス」を無視して、リファレンスの簡単な書き方を覚えてみては如何でしょうか?

JavaScriptのリファレンス(参照)という概念

あまり慣れていないJavaScriptで、あまり考えずにプログラムを作っていたのですが、ある時、何故コレがちゃんと動くのか、と疑問に思って確認してみると、JavaScriptでは、配列やオブジェクトは全てリファレンス(参照)でした。

なので、配列やオブジェクトを扱うときは、必要なときには自動的にデリファレンスする、という感じです。

JavaScriptでは、配列やオブジェクトを作るときは、本来は先に宣言してから書くのですが、リテラルで書くのが一般的です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function show (args) {
console.debug(args);
}

var str = 'string';
show(str);

// 配列
var array = [0, 1, 2]; // 配列の書き方で代入
show(array);

// オブジェクト
var obj = {key1: 'value1', key2: 'value2'}; // オブジェクトの書き方で代入
show(obj);

Perlでリファレンスを書く

先ほどのJavaScriptと同じようなことを、Perlで普通に配列やハッシュを使って書くとこうなります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use DDP {deparse => 1};

sub show {
my $args = shift;
p $args;
}

my $str = 'string';
show($str);

my @array = (0, 1, 2);
show(\@array);

my %obj = (key1 => 'value1', key2 => 'value2');
show(\%obj);

色々記号が出てきて嫌な感じですね。

では、JavaScriptと同じように、リテラルで書いてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use DDP {deparse => 1};

sub show {
my $args = shift;
p $args;
}

my $str = 'string';
show($str);

my $array = [0, 1, 2];
show($array);

my $obj = {key1 => 'value1', key2 => 'value2'};
show($obj);

記号が$だけになりましたね。

@%を使って書くよりも見やすいと思いませんか?

プログラミング言語の基礎

プログラミング言語を覚えるときは、基礎は大事です。

しかし、例えばJavaScriptで配列の作成方法として、ほぼ使わないような「宣言から作成する方法」から学ぶのは得策ではないように思います。

より一般的に使われる、リテラルで書く方法から学ぶことが多いと思います。

ある程度覚えてから基礎を振り返ることによって、更に理解が深まる、ということもあるのではないでしょうか。