2部 Perl言語仕様

変数

1.変数の基礎

ほとんどのプログラム言語には、値を一時的に記憶しておくための『変数』という機構が用意されています。変数はプログラムが終了するまで値を保持することができ、何度でも利用することが可能です。ここでは、変数の宣言から代入、参照の方法を解説します。

変数の宣言

Perl での変数宣言はとても単純です。先頭に1文字の記号を付け、その後に変数名を指定します。

変数を宣言する
$x;

変数の先頭に ダラー ( $ ) 記号のある変数はスカラ変数と呼ばれます。上記の式では xが変数名で、$x が1つの変数を表します。詳しくは後ほど説明しますが、スカラ変数以外にも、先頭にアットマーク( @ ) 記号を付ける配列変数、パーセント( % )記号を付けるハッシュ変数などがあります。

変数の表記

変数名は英字とアンダースコア( _ )を自由に組み合わせることができます。変数名に数字も使うことができますが、変数名の先頭に数字を使った場合は英字やアンダースコア( _ )を使うことができません。

変数名のルール
$name_01;   # OK
$_name_01;  # OK
$0234;   # 数字で始まる変数名は、すべて数字で表記する

また、大文字と小文字は区別されます。$a と $A は違う変数として扱われます。

変数名の大文字と小文字
$a = 1; # $a に 1 を代入
$A = 2; # $A に 2 を代入。$a の値に影響はない

変数へ値の代入

変数への値の代入には、代入演算子 ( = ) を使います。

変数に値を代入
$x = 5;

変数 $x に 5 を代入しています。この状態の $x は数値の 5とまったく同じに扱うことができ、あとから利用することができます。ここでは変数 $xに数値が格納されていますが、その他に文字列や様々なタイプの値を格納することができます。

次の式では、100 に $x を足して $y に代入しています。

$y = 100 + $x;

$x には 5 が代入されているので、 $y には 100 + 5 の結果の値 105 が代入されます。

変数と文字列を区別する方法

変数が他のアルファベットとくっついてしまう時はカーリーブレース { } で変数名を囲んで区別します。

変数と文字列リテラルの区切り方
$x = "index";
$y = "${x}.html"; # $y の値は"index.html"

2.変数の有効範囲

変数の宣言方法や代入方法、様々なデータ型の記録方法をマスターしたら、次に知っておくことは厳密な宣言方法や記録の有効範囲です。

変数の有効範囲

変数には、使うことができる有効範囲があります。基本的には、宣言したブロック{}の範囲内だけで使うことができます。このように有効な範囲を決められている変数を『ローカル変数』と呼びます。

ローカル変数とは逆に、ブロック外で宣言した変数は、そのプログラム内のすべての場所が有効範囲になります。このような変数を『グローバル変数』と呼びます。

ローカル変数とグローバル変数の違い
$a = 1; # $a はブロックの外で宣言されているのでグローバル変数です
{
      $b = 1; # $b の有効範囲はこのブロック内
}
print $a, "\n"; # $aの値 1 が出力されます
print $b, "\n"; # $bは存在しないので、出力されないか、エラーとなります。

ブロックの外で宣言された $a はすべての範囲で有効ですが、ブロック{} 内で宣言された $bはそのブロック内だけが有効となります。

my を使った変数の宣言

今まで変数の宣言はダラー( $ )と変数名だけで行っていましたが、変数の前にmyを使うことでもっと高度な処理を行うことができます。

myを使って変数を宣言する
my $x = 5;

myを使って宣言された変数は、その宣言されたブロック{}の範囲内だけが有効だということが保障されます。

たとえば、次の例を見てください。

my $a = 1;
{
	my $a = 10;
	my $x = $a + 10; # $x の値は 20
}
my $x = $a + 10; # $x の値は 11

ブロックの外にある $a と、ブロック内にある $a はまったく別物です。ブロック内で $a に 10を代入していますが、ブロックの外にある $a は 1 のままです。ですから $x には 1 + 10 の答え、11 が代入されます。

local
my

3.スカラ以外の変数

今まで扱ってきた変数はスカラ変数と呼ばれるものです。Perlには、スカラ変数以外にも複数のスカラ変数を扱うための配列、ハッシュなどが用意されています。

変数のデータ構造(スカラ、配列、ハッシュ)

Perlの変数には、『スカラ』、『配列』、『ハッシュ』というデータ構造があります。変数の種類は変数名の前につく1文字で区別されます。スカラ変数の場合はダラー( $ )、配列変数はアットマーク( @ )、ハッシュはパーセント( % )が変数の先頭につきます。

スカラ、配列、ハッシュの宣言
# スカラ変数
$scalar;
# 配列変数
@array;
# ハッシュ変数
%hash;

次の表は、スカラ、配列、ハッシュ、それに型グロブの特徴の一覧です。

変数のデータ型の一覧
記号 意味
スカラ $ $value 1つの変数で1つの値を記録します。
配列 @ @value 配列はスカラ変数のリストです。個々のスカラには、0から始まる数字のインデックスを使ってアクセスすることができます。
ハッシュ % %value ハッシュは、複数のスカラをキーと値のペアによって格納する変数です。配列とは違って順番がなく、キーを指定して個々のスカラにアクセスします。
型グロブ * *glob glob という名前を持つ変数すべてを意味します。

スカラ、配列、ハッシュの代入と出力の例は以下のとおりです。

変数への代入
$scalar = 1; # $scalar に 1 を代入
print $scalar, "\n";
>1
@list = ( 1, 2, 3 ); # @list に 3 つの値を代入
print $list[0], "\n";
>1
%hash = ( a => 1, b => 2, c => 3 ); # %hash にキーと値を代入
print $hash{'a'}, "\n";
>1

変数の名前空間

変数の種類は先頭の文字で判別されるので、スカラ、配列、ハッシュで同じ変数名を使っても別ものとして扱われます。たとえば、スカラ変数$a は、配列変数 @a とは変数名が同じだけで、まったく別の変数として扱われます。

変数の名前空間
$a = 1; # スカラ変数 $a に 1 を代入
@a = (1, 2, 3); # 配列 @a に3つの値を代入。 $a には影響ありません

4.コンテキスト

サブルーチンや演算子のいくつかは、スカラとリストのどちらを返して欲しいのかを判断し、最適な結果を返す仕組みを持っています。

スカラとリストのどちらの値が必要なのかという要求のことを『コンテキスト』といいます。1つの値を要求するのを『スカラコンテキスト』、複数の値を要求するのを『リストコンテキスト』と呼びます。

スカラとリストのコンテキストを調べる

コンテキストの利用法

いくつかの関数や演算子は、スカラとリストの両方のコンテキストに対応できるようになっています。

スカラコンテキストとリストコンテキストの違い
# STDINはすべての行を配列として返します
@line = <STDIN>;
# STDINは1行を返します
$line = <STDIN>;

最初の<STDIN> 演算子は、リストコンテキストですから、STDINから読める限り最後の行まで読み出し、その行のリストを返します。次の<STDIN>演算子は、スカラコンテキストなので、STDIN から 1 行を読み出します。

配列をスカラコンテキストで評価

コンテキストで返す値が変わってくるのはサブルーチンや演算子だけではありません。配列をスカラとして評価すると、配列中の要素数が返されます。

配列をスカラに代入
$count = @list;

スカラとリストのコンテキストを調べる

Perlに用意された組み込み関数のほとんどは、スカラコンテキストとリストコンテキストによって返す値を自動的に選別します。自分でサブルーチンを作るような場合などで、スカラコンテキストとリストコンテキストの要求を調べるには

wantarray が便利です。

wantarrayは、リストコンテキストあれば TRUE、スカラコンテキストであれば FALSEを返します。次のサブルーチンは、コンテキストの種類によって、配列、もしくは配列の最初の要素を自動的に選別して返します。

sub chk_cont {
      ...
      return wantarray ? @array : $array[0];
}

wantarray

5.特殊変数

Perl には、特殊変数という特別な意味を持った変数が用意されています。表記が $|のように意味不明なため、プログラミング初心者でなくても使うのがためらわれる代物ですが、特殊変数を効果的に利用するとでプログラミングが楽になります。

特殊変数一覧

もっともよく利用されている特殊変数 $_

Perl では変数 $_ をもっともよく使うことになります。ほとんどすべての関数はデフォルトで $_に作用するようにできています。

$_ 変数の使い方
# $_ を使った foreach 文
foreach ( @key ){
   print;
}
# 省略しない場合の foreach 文
foreach $_ ( @key ){
    print $_;
}

上記の命令文は、1行目で@key配列から配列の要素を取り出して $_ に代入し、2行目でprint命令により $_ を出力しています。 $_はどこにも書かれていませんが、デフォルトの変数として自動的に代入、出力されています。

特殊変数の英語名

特殊変数は $_ や $| のようなわかりにくい名前になっていますが、次の指定で説明的な英語名が使えるようになります。

use English;

ファイルハンドル特殊変数

英語名が $FORMAT_ で始まるものは、フォーマットを利用した場合にだけ使われます。

ファイルハンドルを選択するには次の指定が便利です。

use FileHandle;

この指定でファイルハンドラ用の特殊変数が使えるようになります。

メソッド ハンドル 式;

次のような使い方もできます。

ハンドル->メソッド(式);

パターンマッチ特殊変数

常にブロック内に局所化される特殊変数です。どれも最後に成功したパターンマッチに関連する値を保持しています。

$x = 'abcdefg';
$x =~ /cd/;
print "マッチした文字の前にある文字: $`", "\n";
> マッチした文字の前にある文字: ab
print "パターンマッチにマッチした文字: $&", "\n";
> パターンマッチにマッチした文字: cd
print "マッチした文字の後にある文字: $'", "\n";
> マッチした文字の後にある文字: efg

関連記事