変数とデータ型
アセンブラの魔女 ⧫ Perl ⧫ 変数とデータ型
アセンブラの魔女 ⧫ Perl ⧫ 変数とデータ型
変数の型
スカラ変数
リスト
配列変数
連想配列変数
変数の表記
レキシカルスコープ変数
ダイナミックスコープ変数
Perlの変数には次の3つのデータ型があります。
  • スカラ型
  • 配列型
  • 連想配列型

 スカラ型の変数は、(配列のような構造を持たない)単純なデータ型で数や文字列を表します。配列型の変数はスカラ型を配列構造にしたもので、それぞれの要素を数字の添字を使って指定します(C/C++の配列と同等の概念です)。連想配列型の変数もスカラ型の変数ですが、添字に文字列を使う点が通常の配列と異なります。

 それぞれのデータ型で同じ名前の変数が存在することができます。たとえば、aという名前のスカラ型の変数とスカラ型の配列はまったく別物として扱われます。

Perlには多次元配列の機能はありませんが、連想配列を使って同様の機能を実現することができるようです。

 スカラ変数は、(配列のような構造を持たない)単純なデータ型で数や文字列を表します。スカラ変数を表記するには、変数名の先頭に「$」を付けます。

$var

 上の例はvarという名前のスカラ変数を意味します。

 PerlにはC/C++のような厳密な型定義は無く、数値も文字列もスカラ型で表現されます。 スカラ変数が文字列として扱われるか、数値として扱われるかはコンテキストによっ て決定されます。 例えばスカラ変数$varに文字列"100"を代入した後、$varを算術演算に用いると、$varは文字列("100")ではなく数値(100)として扱われます。

 式をカンマで区切って「(」と「)」で括ったものを「リスト」と呼びます。例えば以下は1, 2, 3の数値のリストです。

( 1, 2, 3 )

 リストは配列に一括して代入することができます。

@array = ( 1, 2, 3 )

 リストの要素に配列を指定した場合、その配列の要素を並べたものと同じ意味になります。

1: @array = ( 1, 2, 3 )
2: @array2 = ( 0, @array, 4 )
3: @array3 = ( 0, 1, 2, 3, 4 )

 上記の2行目と3行目は同じ動作になります。

 リストには部分演算子という便利な演算子が使えます。部分演算子は「..」で表現され、「..」の両側の式の間の値のリストを意味します。 例えば、1..5は(1, 2, 3, 4, 5)と等価で、a..cは(a, b, c)と等価です。

 リストの要素には変数を使うことができます。この表現を使ってリスト内の変数に値を代入することもできます。 例えば次の例は、key=value形式の文字列をsplit関数でkeyとvalueに分割してそれぞれ変数$keyと$valに取り込みます。 配列変数に取り込むより、リスト内の変数に取り込んだほうが簡潔にプログラムが書けることもあります。

( $key, $val ) = split( /=/, $_ );

 配列変数ははスカラ型の1次元配列の構造を持ちます。Perlでは直接的に多次元配列をサポートしませんが、連想配列を使って実現することができるようです。配列の要素は、変数名の後に鉤括弧[]と数字の添字を付けて表現します。例えばvarという名前の配列変数の最初の要素を表現するには、次のように書きます。

$var[0]

 配列名の先頭に@を付加することにより配列全体を表現することもできます。次の例はvarと言う名前の配列全体を意味します。

@var

 配列名の先頭に$#を付けると配列の要素数(添字の最大値)を調べることができます。例えば、次の例では配列arrayは3つの要素を持ち、添字の最大値は2となります。

@array = (10,20,30);

 このとき、$#array を使うと、配列変数arrayの添字の最大値2が得られます(つまり要素数は3)。

 配列の先頭の要素の添字は通常0ですが、先頭要素の添字を示すシステム変数$[で 別の値に設定することもできます(しかし、混乱の元になると思われるので、よほどの理由が無い限り使わないほうが良いと思います)。これは上記の$#にも影響を与えます。

$[ = 1;
@a = ( 10, 20, 30 );     # $a[1] = 10, $#a = 3となる

 $#以外に、直接的に配列の要素数を調べる方法もあります。スカラ型の値が要求されるコンテキストで配列全体を指定すると、その配列の要素の数が返ります。

$a[ 0 ] = 10; $a[ 1 ] = 20;
$b = $#a;   # $bの値は1 (配列aの最大添字)
$c = @a;    # $cの値は2(配列aの要素数)

 スカラ型が要求されないコンテキストでは、次のように書きます。

print 0+@a;  # 配列の要素数を出力

 さらに、scalar関数や、を使って配列の要素数を調べることもできます。

print @a;              # 配列の中身を出力
print scalar( @a );    # 配列の要素数を出力

 Perlでは配列が要求されるコンテキストとスカラ型が要求されるコンテキストがあります。例えばprint文の引数は配列が要求されるコンテキストであり、加減算の引数はスカラ型が要求されるコンテキストです。現在のコンテキストがどちらのコンテキストであるかは、wantarray演算子で判断することができます。これを使うとサブリーチンのコンテキストへの依存を弱めることができます。

sub nekoya {
    wantarray ? ('n', 'e', 'k', 'o', 'y', 'a')    # 配列コンテキスト
              : 'n,e,k,o,y,a';                    # スカラコンテキスト
}
@a = &nekoya;      # @a ← ('n', 'e', 'k', 'o', 'y', 'a')
$a = scalar(&nekoya);  # $a ← 'n,e,k,o,ya'

#&nekoyaはnekoyaというサブルーチンの呼び出しを行う


reverse演算子や繰り返し演算子はコンテキストにより振舞いが異なります。


@a = ( 'neko', 'inu', 'saru' );
@b = reverse( @a );          # @b ← ('saru', 'inu', 'neko')
$b = reverse( @a );          # $b ← 'uras'

 リストを使って配列の一部を別の配列のように利用することができます。これを部分配列と言います。

 連想配列では通常の配列とは異なり、添字に文字列を使います。これはC言語のenumと似ていますが、同じ値を複数の要素に設定できる点が異なります。 連想配列の要素は、スカラ変数名の後に中括弧{}と添字文字列を付けて表現します。

$array[ 7 ]      = 'neko';   # 通常の配列
$array{ 'neko' } = 7;        # 連想配列

連想配列では配列全体を表現する場合に、連想配列の名前の先頭に%を付けます。

%array   # arrayという名前の連想配列全体
表記意味
$a aという名前のスカラ変数
$a[0] 配列@aの要素
$a[0,2] $a[2]と同じ
$a{'A'} 連想配列%aの要素
$a{'A','B'} $a{"A%;B"}と同じ
@a aという名前の配列全体
@a[0] $a[0]だけを要素とする配列
@[0,2] $a[0], $a[2]を要素とする配列( ($a[0], $a[2])と等価 )
@a{'A', 'B'} $a{'A'}、$a{'B'}を要素とする配列 ( ($a{'A'}, $a{'B'})と等価 )

 myを使ってローカル変数を作ることができます。

my $var;
my $var = value;
my( var, var, ... );

 myで生成された変数はレキシカルスコープ変数と呼ばれます。局所変数はlocalによっても作ることができますが、Perl内部のメモリの管理の方法はmyとは異なります(myの方が他の言語のローカル変数に近く高速)。

 localを使って変数を局所化することができます。

local $var;
local $var = value;
local( var, var, ... );

 変数を局所化するには、myを使うこともできますが、Perl内部における変数の持ち方はmyとlocalでは異なります。localで作られた変数はダイナミックスコープ変数と呼ばれます。ダイナミックスコープ変数はグローバル変数と同じ名前空間に存在します。これを局所化するために、同じ名前の変数の値を、それが用いられるスコープごとに用意しています。これが一般に変数の局所化にlocalよりmyが推奨される理由だと思います(localの方が内部処理が複雑で遅くなる)。

▼ Property
記事情報
datePublished2011-01-01
dateModified2018-07-25
authorアセンブラの魔女
headlinePerlの変数とデータ型についてのページです
keywordsPerl
keywords変数
keywordsデータ型
keywordsスカラ変数
keywordsリスト
keywords連想配列
keywordsレキシカルスコープ
keywordsダイナミックスコープ
publisher name= wiredFish, logo.name= wiredFish, logo.url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png size= 208 pixel x 50 pixel
image.url url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png , size= 208 pixel x 50 pixel