HOME -> プログラム -> Perl -> 変数、配列、ハッシュ

変数、配列、ハッシュ

変数

 まずは変数ですよ! PerlはC/C++等と違い、変数の宣言を必要としません。 また、型の拘束もかなり緩やかです。 Perlにおいて変数を使用するには変数名の前に「$」マークを付けるだけです。
#!Perl
$a = 5;
print $a;
 として実行すると
5
 と表示されます。

 Perlをさわっていると必ず $_ という変数にぶつかります。 頭に $ が付いているんだから変数なんだろうと思っていても、いまいち使い方が把握できない・・・ これは何なんでしょうか?
 これはデフォルト変数と呼ばれるものです。Perlでは様々な場面でこのデフォルト変数にユーザーが使用するであろう数値を勝手にいれてしまう便利?な変数です。以下はサンプルです。
#!Perl
foreach (1..5){
    print $_,"\n";
}
 として実行すると
1
2
3
4
5
 foreachの構文は
foreace $変数 ( 配列等 )
( ) 内の配列から要素を受取り、それを変数に渡しています。 それを $_ を使用してショートカットしています。 あるいは関数内での使用法として
#!Perl
sub ff{
    $ff = $_ * 2;
}
$res = &ff(8);
print $res;
として実行すると
16
 判りますか? ここでは関数に引数として数値を渡してあります。それを ここらへんは一例二例で理解するのは難しいかと思います。 Perlにおいてこの $_ はあまりにも多岐に渡り利用が可能であるため、最初は少しハードルが高いところでもあります。

配列

 Perlには配列もあります。 配列とは変数の集まりみたいなものです。 Perlの配列宣言は、変数の $ ではなく頭が @ から始まるものになります。 ただし、配列の各要素にアクセスするには $変数名[指定要素番号] となります。 ですが @array というものを宣言したとして $array という変数には全くなんの関係もありません。 ただし $array[要素番号] とすることで @array の指定要素にアクセスできます。
#!Perl
@a = (5,4,3,2,1,0);
print $a[0];
 として実行すると
5
 となりますが
#!Perl
@a = (5,4,3,2,1,0);
print $a; 
 として実行すると何も表示されないのです。@配列名と$変数名は関連が無いのです。 ついでながら
#!Perl
@a = (5,4,3,2,1,0);
print @a; 
 として実行すると
543210
 となります。これは配列の要素をそのまま展開した事になります。 ではこれは?
#!Perl
@a = (5,4,3,2,1,0);
$a = @a;
print $a; 
 として実行すると
6
 配列をスカラー変数(ようは普通の$変数です)に代入してみると要素数が返されます。 ここら辺の動作が初心者にはどうにも判りづらいところだと思います。 また配列内には整数型、浮動小数点型、文字型の混在が可能です。
#!Perl
@a = (11,"文字列",1.2546);
print @a; 
 として実行すると
11文字列1.2546
 という具合に文字、数値ぐっちゃぐちゃで配列への格納が可能です。

ハッシュ(連想配列)

 PerlにはあってC/C++等には無い機能の一つに連想配列(ハッシュ)というものがあります。 これは配列に似ていますが、異なるのは要素を指定するキーが番号ではなく任意の文字列等を指定できるという点です。 これは要素へのアクセスが配列より直感的に行える利点がありますが、キーは必ずそのハッシュの中で一個だけしか存在できません。 もし同じキーを宣言してしまった場合、後から宣言したキーの要素で同じ名前の先に宣言したキーの要素が上書きされます。 気をつけるところはそれぐらいで扱い自体は配列に似て簡単なものです。 実際に簡単な例で見てみます。
#!Perl
%a = ("abe",24,"suzuki","pop","sato",1.23);
print $a{"suzuki"}; 
 として実行すると
pop
 となります。ハッシュでは頭に %マークを付けます。 そしてハッシュの要素には $ハッシュ名{キー} という具合にアクセスします。 またまた混乱しそうな事になってきましたね。 ハッシュの格納は
%a = (キー,内容,キー,内容・・・);
 という具合になってますので、格納する時一つ間違うとキーと内容があべこべになってしまうので気を付けないといけません。 よく間違われる事ですが、ハッシュに格納された要素は格納したときの ( ) の書式順になっているわけではありません。 どんな順番で格納されているかはぱっと見ではわかりません。最適化アルゴリズムによって格納位置が指定される為、
#!Perl
%a = ("suzuki","pop","tani",542,"gai","ojoko");
print %a; 
 として実行すると
gaiojokosuzukipoptani542
 という具合に順番は宣言時の ( ) 順ではありません。

 ハッシュは配列への代入が可能です。 その場合には キー、要素、キー、要素 の順番で配列の要素に格納されます。 順番は先ほど書いたように宣言時の順番では無い場合がほとんどです。
#!Perl
%a = ("abe",1,"suzuki","pop","sato",1.23);
@a = %a;
print $a[0],$a[1]; 
 として実行すると
abe1
 となります。ここでは $a[0]にabe が入っていて $a[1]には 1 が格納されていました。 ハッシュから配列に代入を行うとキーと要素の結びつきが解かれるのでアクセスには気を付けないといけません。

 それにしても毎回
%a = ("abe",1,"suzuki","pop","sato",1.23);
 のように書いていると間違える可能性が高そうです その場合は => 記号を使ってみてください。
#!Perl
%a = ("abe"=>1,
      "suzuki"=>"pop",
      "sato"=>1.23);
 の様に宣言すれば、少しは見やすくなります。 , で区切るだけで宣言を行うと間違いやすくなりますので、こちらの書き方をお勧めします。


2008年 11月 1日ドキュメント作成
2008年 11月 1日ドキュメント更新