変数

思いとどまってmyより先に変数をやってから進む。

まず変数に型があるかということから。

Perlの型の概念。

http://d.hatena.ne.jp/perlcodesample/20080312/1205337470

### Perlにおける型の概念
# ・Perlの型の概念は、他の言語とまったく異なる。
# ・Perlは、整数型や不動小数点型や文字列型といった、
# 中に含まれるものの区別によって、型を区別するのではない。
# ・Perlは、変数の中に含まれる値の個数で、型を区別する

JavaScriptの変数は入れた値によって型がかわったけど、Perlの場合は格納された値の個数でかわるということか。

Perlでの型は以下の3つ。

スカラー

* スカラー型は、変数の中にたった一つの何らかの値を、含むことができる。
* $を変数名の前につけることで、スカラー型を表す。

配列型

* 複数の値を含むことができる。
* 配列型の各要素に含むことができるのは、スカラー型のみである。
* @を変数の前につけることで、配列型を表す。
* ハッシュ型に代入できるのは、リスト ( ) だけである。

ハッシュ型

* キーと値がセットになった複数の値を含む
* ハッシュ型の各要素に含むことができるのは、スカラー型のみである。
* @を変数の前につけることで、配列型を表す。
* ハッシュ型に代入できるのは、リスト ( ) だけである。

配列型とハッシュ型

* 配列型もハッシュ型も、その中身はどちらもリストであり、等価である。
* 配列型をハッシュに代入することで、ハッシュ型に変換したり、その逆もできる。

というわけでやってみる。
文字列の連結方法がわからず2分はまった。

#!/usr/bin/perl
use strict;
use warnings;

# スカラー型
$a = 1;
print "$a\n";
$b = 0123;
print "$b\n";
$c = 1.234;
print "$c\n";
$d = "aaaaa";
print "$d\n";

# 配列型
@array = (1, 2, "3");
print "$array[0]\n";
print "$array[1]\n";
print "$array[2]\n";

# ハッシュ型
%hash = ( "key1", 1, "key2", "aa" );
print $hash{"key1"} . "\n";
print $hash{"key2"} . "\n";
C:\MyWorks\Perl\variable>perl variable1.pl
Global symbol "$c" requires explicit package name at variable1.pl line 11.
Global symbol "$c" requires explicit package name at variable1.pl line 12.
Global symbol "$d" requires explicit package name at variable1.pl line 13.
Global symbol "$d" requires explicit package name at variable1.pl line 14.
Global symbol "@array" requires explicit package name at variable1.pl line 17.
Global symbol "@array" requires explicit package name at variable1.pl line 18.
Global symbol "@array" requires explicit package name at variable1.pl line 19.
Global symbol "@array" requires explicit package name at variable1.pl line 20.
Global symbol "%hash" requires explicit package name at variable1.pl line 23.
Global symbol "%hash" requires explicit package name at variable1.pl line 24.
Global symbol "%hash" requires explicit package name at variable1.pl line 25.
Execution of variable1.pl aborted due to compilation errors.

いきなりのエラー大量発生。
これはuse strictを付けたからというわけで外してやってみると通る。
まあ外す意味も無いのでエラーを修正。
ここでmyを付ければいいというわけだけど、気になるのが全部myを付けなければならないのならばなぜ$a、$bでエラーが出ないのかということ。
ちなみに$c, $dを$a, $bに変えるとエラー出ず。$a, $bを$aa、$bbに変えるとエラーが出る。謎い、謎すぎる。
特殊な変数なのかなと思ってググってみてもそんなのは出てこない。
とりあえずやむなくここは放置とする。

というわけでmyを付けてretry。

C:\MyWorks\Perl\variable>perl variable1.pl
1
83
1.234
aaaaa
1
2
3
1
aa

$bには0123と入れて83と出たところを見ると

http://www.mapee.jp/dproom/10perl.html

0で8進、0xで16進とJavaScriptとこの辺のリテラルは同じ。

次に、配列型とかハッシュ型のときに型宣言では@や%なのに要素アクセスではなんで$なのかと気になってたらちゃんと書いてあった。

http://perl-users.jp/modern_introduction_perl/variables.html

配列のsigilが「@」から「$」に変化するのがわかりにくいかもしれませんが、これはどのような変数にアクセスしているのか考えるとわかりやすいかもしれません。

配列として全体に対して操作する場合は「@」を使用します。

join(" | ", @list);

配列の要素一個一個はスカラーですので、要素一個一個にアクセスする場合は「$」を使用します。

print $list[ 0 ];

こう説明されるとわかりやすい。要素1つ1つはスカラーなので$を使えと。

そういえばJavaScriptでは変数に関数を入れられたけどもPerlではどうかというわけで試す。

#!/usr/bin/perl
use strict;
use warnings;


# 変数にサブルーチンを入れてみる
sub mysub
{
	print "hello world!\n";
}

my $sub = mysub();
C:\MyWorks\Perl\variable>perl variable2.pl
hello world!

結果は、入ったっていうか実行された。JavaScriptでは()を付けない限り格納されるだけだったが、Perlでは実行されるんだろうか。

そういえば無名関数はどうなんだろうということで調べてみる。

http://www.geocities.jp/ky_webid/perl5/028.html

無名配列や無名ハッシュが存在するように、無名関数(無名サブルーチン)というものもあります。名前が無いのですから、やはりリファレンスを経由してアクセスする以外の使い道がありません。無名関数は、次のように使います。

#!/usr/bin/perl
use strict;
use warnings;


# 無名関数
my $mysub = sub
{
	print "hello world!!!\n";
};

# 呼び出し1
$mysub->();
# 呼び出し2
&$mysub;
C:\MyWorks\Perl\variable>perl variable3.pl
hello world!!!
hello world!!!

リファレンスってなんぞと思って調べてみたら、昔ほんのちょこっとだけやったことがあるCでいうアドレスと同じ概念ぽい。

  • >ってのもCっぽい感じ。

というわけで変数は概念的なことはわかった、と思う。