変数

■Perlの変数■
プログラムの中で前に使ったデータを後でも利用したいときに変数を使います。
Perlには、スカラー変数、配列、ハッシュ(連想配列)というものがあり利用でき、
変数名の前にプレフィックスと呼ばれる記号をつけることにより変数を区別します。
* サブルーチンは変数とはちょっと違いますが、プレフィックスを付けるので紹介します。

スカラー変数:$
配列:@
ハッシュ(連想配列):%
サブルーチン:&

変数の命名規則です。
・英字(a~z、A~Z)、またはアンダースコア(_)で始まる。
・英字、アンダースコアまたは数字(0~9)が続く単語が指定可能。
・文字数の制限はなし。
・大文字、小文字は区別される。
$abc     # OK
$_abc    # OK
$abc123  # OK
$123abc  # NG(数値で始まっている)

「2. 基本構成」で必ず「use strict」を書いてくださいとお願いしました。「use strict;」を付けると、
変数の前に「my」を付けて変数の宣言をする必要が出てきます。
use srict;
my $a = 100; # エラーとならない。
$b = 100; # エラーとなる。

■スカラー変数■
スカラー変数は、数値/文字列/リファレンスなど、さまざまな値を1つだけ保存できる。
プレフィックス($)が頭に付き、数値/文字列の区別はなく、必要に応じて自動変換される。
my $a = 100; # $aに100を代入する。
my $b = "hoge"; # $bに文字列「hoge」を代入する。

■配列■
配列は、スカラー値の集合を表します。
プレフィックスは(@)が付き、添え字を使って個々の要素にアクセスします。
# 配列の初期化
my @a = ("aa","bb","cc","dd","ee");
my @b = qw/aa bb cc dd ee/; @aと@bは同じデータが入ります。
my @c = (1 .. 100); # @cには、1~100の数字が入ります。
my @d;
$d[0] = "aa";
$d[1] = "bb";
$d[2] = "cc";
$d[3] = "dd";
$d[4] = "ee"; # これも@aと@bと同じデータが入ります。
# データアクセスには、プレフィックス(@)を使わずに($)を使うのが一般的です。

配列データの操作
関数名 動作/使用方法
push 配列の末尾に要素を追加する。

使用方法:push(@array,list)
@array:追加対象の配列
list:追加する要素
戻り値:追加後の配列の長さ
pop 配列の末尾から要素を削除する。

使用方法:pop(@array)
@array:削除対象の配列
戻り値:削除した要素。要素が1つもない場合、未定義値。
unshift 配列の先頭に要素を追加する。

使用方法:unshift(@array,list)
@array:追加対象の配列
戻り値:追加後の配列の長さ
shift 配列の先頭から要素を削除する。

使用方法:shift(@array)
@array:削除対象の配列
戻り値:削除した要素。要素が1つもない場合、未定義値。
splice 配列の要素を削除する。

使用方法:splice(@array,pos,[n],[list])
@array:削除対象の配列
pos:削除開始する位置(配列のインデックス)
n:削除する要素数。省略した場合は配列の最後まで削除される。
list:指定した場合、削除した要素を指定したリストで置き換える。
sort 配列の中身をソートする。

使用方法:sort [code] @array
@array:ソート対象の配列
code:サブルーチン名またはコードブロック
reverse 配列の要素を逆順に並び替える。

使用方法:reverse(@array)
@array:並び替え対象の配列
戻り値:逆順に並べ替えたリスト
map 指定したブロックまたは関数で配列の各要素を評価し、1つの配列にして返す。

map {block} @array
map(expr,@array)
block:評価ブロック
expr:評価関数
@array:操作対象配列
grep 配列から条件と一致した値を取り出す。

grep {block} @array
grep(expr,@array)
block:評価ブロック
expr:評価関数
@array:操作対象配列

■ハッシュ(連想配列)■
ハッシュは、プレフィックス(%)を頭に付け、任意の添え字(キー)を使って個々の要素にアクセスします。
# ハッシュの初期化(%aと%bは、同じですが初期化方法が少し違います。)
my %a = ('aa','bb','cc','dd');
my %b = ('aa'=>'bb','cc'=>'dd');

# 要素へのアクセス
print $a{'aa'} . "\n"; # 「bb」と表示されます。
print $b{'aa'} . "\n"; # 「bb」と表示されます。

# 環境変数もハッシュに格納されています。=>%ENV
# 環境変数一覧を表示する。
print $_ . ":" . $ENV{$_} . "\n" for (keys %ENV);

ハッシュデータの操作
関数名 動作/使用方法
keys ハッシュのキー配列を得る。

使用方法:keys(%hash)
%hash:対象のハッシュ
戻り値:キー配列
values ハッシュのデータ配列を得る。

使用方法:values(%hash)
%hash:対象のハッシュ
戻り値:データ配列
each ハッシュからキーとデータを得る。ハッシュが全て読まれると未定義値が返ります。

使用方法:my ($key,$value) = each(%hash)
$key:キー値
$value:データ
%hash:対象のハッシュ
戻り値:キー値とデータ
exists 対象のハッシュに指定したキー値が存在するか確認する。

exists($hash{$key})
$hash{$key}:確認するハッシュの要素
戻り値:存在する(true),存在しない(false)。
delete 指定のハッシュ要素をハッシュから削除する。

delete($hash{$key})
$hash{$key}:削除するハッシュの要素
戻り値:成功(true),失敗(false)

■その他変数■
特殊変数
Perlの特徴のひとつで、省略した記述ができます。
これは、本来値を指定する箇所に値を指定しなくてもエラーとならず、プログラムを実行できることです。
省略された変数は「$_」を使用しています。
print; # print $_; のことです。
/abcdefg/; # $_ =~ /abcdefg/; のことです。
for (1 .. 10); # for内のカウンタに「$_」を使用します。

型グロブ
同じ識別子(プレフィクス以降)を持つあらゆる値を表現する ワイルドカードのようなもの。
以下のサンプルを見たほうがわかりやすいかもしれません。
# まず変数を定義する。
$a = 'aaa';
@a = ('aaa','bbb','ccc');
%a = ('aaa'=>'bbb','ccc'=>'ddd');
sub a{return 'bbb';};

# 型グロブにはプレフィックス(*)を付けます。
*a;

# 型グロブ自身はリファレンスを格納したハッシュであり、キーはデータ構造の名前です。
*a{SCALAR}; # \$a
*a{ARRAY};  # \@a
*a{HASH};   # \%a
*a{CODE};   # \&a
*a{GLOB};   # \*foo(自分自身へのリファレンス)
*a{IO};     # ファイルハンドル
*a{FORMAT}; # フォーマット

以上です。                                            >>4. 演算子と制御構文