Perl の変数

変数の種類

Perl の変数は、スカラー、配列、ハッシュやリファレンスのようにいくつかの種類がある。Perl プログラムを書くときに、これらの変数に値(データ)を一時的に保存することで、プログラムの中でデータを随時に取り出して処理できたりする。

変数の種類使い方
スカラー$文字列や数値などを 1 だけ保存する
配列@複数の文字列や数値を順序付きで保存する
ハッシュ%複数の文字列や数値を、キーとともに保存する
リファレンス$スカラー、配列あるいはハッシュのメモリ上のアドレスを保存する

Perl の変数の名前は英数字およびアンダースコアを利用して命名することができる。ただし、変数の名前の 1 文字目は英文字またはアンダースコアである必要がある。また、大文字と小文字は区別される。

$pi = 3.14;
$E = 2.27;
$_private = "user name";
@features = ("mRNA", "tRNA", "rRNA");
%dna2aa = ("ATC" => "I", "CCA" => "P", "GTA" => "V");

スカラー

スカラーは、文字列または数値を 1 つだけ代入できる変数である。

$p = 3.14;
$dna = "ACGAGCTTATATAGTCTAC";
$rna = "";

値の定義

プログラムの中で、あるスカラーについて、その値が定義されているかどうかを調べる場合は defined を利用して調べる。値の種類に関わらず、値が定義されていれば、真を返す。

$a;
$b = "";

if (defined $a) {print("a is defined.\n");}
if (defined $b) {print("b is defined.\n");}

## b is defined

値の真偽

Perl では、定義された値に対して、その値が真なのか偽なのかを判定することができる。値が数値の 0 または空文字 の場合の判定は偽であり、それ以外の場合は真である。ただし、空白 " "(スペース 1 以上)は空文字ではない。

$a = "";
$b = "agtcatttcagtacgtggca";
$c = " ";
$d = 0;
$e = 1;
if ($a) {print("a is true.\n");}
if ($b) {print("b is true.\n");}
if ($c) {print("c is true.\n");}
if ($d) {print("d is true.\n");}
if ($e) {print("e is true.\n");}

## b is true.
## c is true.
## e is true.

値の代入

変数の値が定義されていなければ、値を代入して初期化する場合、if 文による条件判断のほかに、次のように 1 行で定義の判定と値の代入を行うことができる。

my $a;
$a //= 'atg';s
print($a);
## atg

$a //= 'ggc';
print($a);
## atg

値が偽ならば代入する場合は次のようにする。

$b = 0;

$b ||= '1';
print($b);
## 1

$b ||= '2';
print($b)
## 1

配列

配列には複数の値を代入することができる。詳細な使い方は配列を参照。

@a = ("A", "B", "C", "D", "E");
$b = (1, 2, 3, 4, 5);

配列の各要素の値が定義されたかどうかを調べる場合は、defined を利用する。また、配列の値が存在するかどうかを調べる場合は、exists

@a = ();
@a[0] = 0;
@a[1];
@a[2] = 2;
@a[4] = 4;

if (defined $a[0]) {print("a[0] is defined.\n");}
if (defined $a[1]) {print("a[1] is defined.\n");}
if (defined $a[2]) {print("a[2] is defined.\n");}
if (defined $a[3]) {print("a[3] is defined.\n");}
if (defined $a[4]) {print("a[4] is defined.\n");}
## a[0] is defined.
## a[2] is defined.
## a[4] is defined.

if (exists $a[0]) {print("a[0] is existed.\n");}
if (exists $a[1]) {print("a[1] is existed.\n");}
if (exists $a[2]) {print("a[2] is existed.\n");}
if (exists $a[3]) {print("a[3] is existed.\n");}
if (exists $a[4]) {print("a[4] is existed.\n");}
## a[0] is existed.
## a[2] is existed.
## a[4] is existed.

if ($a[0]) {print("a[0] is true.\n");}
if ($a[1]) {print("a[1] is true.\n");}
if ($a[2]) {print("a[2] is true.\n");}
if ($a[3]) {print("a[3] is true.\n");}
if ($a[4]) {print("a[4] is true.\n");}
## a[2] is true.
## a[4] is true.

ハッシュ

ハッシュは、値がキーと 1 ペアとなって保存される。例えば、英単語をキーとして日本語を値としたり、mRNA コドンをキーとしてアミノ酸を値としたりして作成することができる。値を取り出すとき、配列では [] の中に添え字を入れていたが、ハッシュでは {} にキーを入れる。詳細な使い方はハッシュを参照。

%dna2aa = ("ATC" => "I", "CCA" => "P", "GTA" => "V");

print($dna2aa{"CCA"});
## P

リファレンス

リファレンスは変数のメモリ上にアドレスを保存するための変数である。このリファレンス変数には、スカラーのアドレス、配列のアドレスやハッシュのアドレスなどを代入することができる。詳細な使い方はリファレンス変数を参照。

$a = 3.14;

$r = \$a;
print($r);
## SCALAR(0x7ffc0e02d8f0)

print($$r);
## 3.14