2.10.1. 変数#

2.10.1.1. 変数の種類#

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

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

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

2.10.1.2. スカラー#

スカラーは、文字列または数値を 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';
print($a);
atg
$a //= 'ggc';
print($a);
atg

値が偽の場合に代入したい場合は、次のようにします。

$b = 0;

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

2.10.1.3. 配列#

配列には複数の値を代入できます。詳細な使い方については、配列の章を参照してください。

@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.

2.10.1.4. ハッシュ#

ハッシュでは、キーと値が 1 組のペアとして保存されます。例えば、英単語をキー、日本語を値とした辞書のようなデータや、mRNA コドンをキー、アミノ酸を値とした対応表などを作成できます。

値を取り出すとき、配列では [] の中に添字を指定しますが、ハッシュでは {} の中にキーを指定します。詳細な使い方については、ハッシュの章を参照してください。

%dna2aa = ("ATC" => "I", "CCA" => "P", "GTA" => "V");
print($dna2aa{"CCA"});
## P

2.10.1.5. リファレンス#

リファレンスは、変数のメモリアドレスを保存するための変数です。このリファレンス変数には、スカラーのアドレス、配列のアドレス、ハッシュのアドレスなどを代入できます。詳細な使い方については、リファレンスの章を参照してください。

$a = 3.14;

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

print($$r);
## 3.14