第2章 スカラー変数

2-1. スカラー変数とは

Perlには、スカラー、スカラー配列、スカラー連想配列という3つの基本的なデータ型があります。
この中で、スカラーデータとは、数値や文字列のような単純なデータのことをいいます。
また、プログラミングに必須の要素として、変数という概念があります。 変数とは、さまざまな値を一時的に記憶しておくために使われる「値の入れ物」のことです。
Perlでは、各データ型に対応した形で、それぞれスカラー変数、配列、連想配列の3つの変数が存在し、スカラー変数とは、その中で最も基本となるもので、数値や文字列を格納することができます。
スカラー変数の名前は、$ (ダラー) + 英字1文字から始まり、それ以降は数字、英字およびアンダースコア ( _ ) を用いることができます。また大文字と小文字が区別されますので、たとえば $a と $A は別物として扱われます。
変数名に使用できる文字
$abc123 変数名として使用可能。
$123abc 数字から始まることはできない。
$abc_123 アンダースコアは使用可能。
$abc-123 ハイフンは使用することはできない。
pagetop

2-2. 数値と文字列

スカラー変数には、数値や文字列を代入することができます。
たとえば、 $x = 1; とすると、$x という変数に数値の 1 が代入されます。
構文例 内容
$x = 1; $x に 1 を代入(整数)
$y = -10; $y に -10 を代入 (整数)
$z = 3.1415; $z に 3.1415 を代入(浮動少数点数)
$a = 'hello'; $a に hello を代入(文字列)
$b = "山田太郎"; $b に「山田太郎」を代入(日本語文字列)
コード例-1
$str = 'りんご';
print "これは$strです。\n";
>  これはりんごです。
1行目で、$strという変数に「りんご」という文字列が代入され、2行目でその$str変数が、「りんご」という代入された文字に置き換わって表示されました。
スカラー変数の使用時に、注意することがあります。 以下のように、変数の直後に英数字が重なる場合です。
コード例-2   悪い例
$tall = 170;
print "私の身長は$tallcmです。\n";
>  私の身長はです。
変数の$tallと、単位のcmの文字列が重なったため、Perlが変数を$tallcmと解釈してしまった例です。
このような場合には、連結演算子を使って、分割して書く方法があります。
コード例-3   良い例
$tall = 170;
print "私の身長は" . $tall . "cmです。\n";
>  私の身長は170cmです。
でも、書き方が少し面倒です。
そこで、このような時のために、次のような記述方法が用意されています。
コード例-4   クールな記述例
$tall = 170;
print "私の身長は${tall}cmです。\n";
>  私の身長は170cmです。
また、スカラー変数を扱う際には、文字列の代入のところでも分かるように、Perlでは文字列を扱う場合には、必ずシングルクォート ( ' ) かまたはダブルクォート ( " ) で囲む必要があります。
シングルクォートで囲まれた文字列を、シングルクォート文字列、ダブルクォートで囲まれた文字列をダブルクォート文字列といいます。
シングルクォート文字列またはダブルクォート文字列を扱う場合の注意点としては、次のようなことがあります。
1. エスケープ
シングルクォートの中でシングルクォート文字を使用する場合、または、ダブルクォートの中でダブルクォート文字を使う場合には、エスケープ記号 ( \ ) でエスケープしなければならない。
構文例 内容
$room = 'Kent's Room'; シングルクォートの中でそのままシングルクォート文字を使用できない。
$room = 'Kent\'s Room'; シングルクォート文字をエスケープすることで使用可。
$room = "Kent's Room"; ダブルクォートの中でシングルクォート文字はそのまま使用可。
$talk = "I said "Wow"."; ダブルクォートの中でそのままダブルクォート文字を使用できない。
$talk = "I said \"Wow\"."; ダブルクォート文字をエスケープすることで使用可。
$talk = 'I said "Wow".'; シングルクォートの中でダブルクォート文字はそのまま使用可。
2. 変数展開
変数を囲む場合、ダブルクォート内では変数展開されますが、シングルクォート内では変数展開されません。
# 変数に代入
$name = "KENT";

print "my name is $name", "\n";
print 'my name is $name', "\n";
>  my name is KENT
>  my name is $name
pagetop

2-3. スカラー演算子

Perlは数学言語でもあり、次のような演算子が用意されています。
1. 算術演算子
これは数値に対して、ある種の数学関数を実行します。
構文例 名称 内容
$x + $y 加算 $x と $y の和
$x - $y 減算 $x から $y を引いた値
$x * $y 乗算 $x と $y の積
$x / $y 除算 $x を $y で割った値
$x % $y 剰余 $x を $y で割った余り
$x ** $y べき算 $x を $y乗した値
コード例(加算)
$a = 1;
$b = 2;

print $a + $b, "\n";
>  3
2. 文字列演算子
これは文字列に対して、連結(加算)や繰り返し(乗算)を実行します。
コード例(連結)
$a = "ABC";
$b = "DEF";

print $a . $b, "\n";
>  ABCDEF
コード例(繰り返し)
$c = "ABC";
$d = 3;

print $c x $d, "\n";
>  ABCABCABC
これは数値に対しても同じです。数値の場合には、これを単に文字列と解釈して処理します。
コード例(連結)
$a = 123;
$b = 456;

print $a . $b, "\n";
>  123456
コード例(繰り返し)
$c = 123;
$d = 3;

print $c x $d, "\n";
>  123123123
3. 代入演算子
スカラー変数に値を代入します。この場合、= は「等しい」ではなく、「代入する」という意味であることを理解しておきましょう。
コード例(代入)
$a = 1;
$b = $a + 2;

print "$b\n";
>  3
文字列の場合も同様に = を使用します。
コード例(代入)
$a = "KENT";
$b = "WEB";
$c = "$a $b";

print "$c\n";
>  KENT WEB
4. 二項代入演算子
代入演算子で、たとえば、$a = $a + 2; のように両側に同じ変数が現れる場合、これを簡便化して記述するための演算子が用意されています。
元の式 二項代入演算子
$a = $a + $b $a += $b
$a = $a - $b $a -= $b
$a = $a * $b $a *= $b
$a = $a / $b $a /= $b
$a = $a . $b $a .= $b
$a = $a x $b $a x= $b
コード例
$a = 1;
$a += 2; # これは $a = $a + 2; と同じ

print "$a\n";
>  3
5. オートインクリメント演算子とオートデクリメント演算子
二項代入演算子をさらに簡便化したもので、変数に1を加減することに特定した演算子です。
構文例 名称 意味
++$a
$a++
オートインクリメント $a に1を加える
--$a
$a--
オートデクリメント $a から1を引く
コード例
$a = 1;
$a++; # これは $a += 1; と同じ

print "$a\n";
>  2
ここで気を付けることは、++$a と $a++ は多少意味が違ってきます。
これらの演算子を変数の前に置くことを「プリインクリメント(プリデクリメント)」といいます。 この場合には、まず最初に変数の値が変更されてから、変更後の値が使われます。
これに対して、これらの演算子を変数の後に置くことを「ポストインクリメント(ポストデクリメント)」といいます。 この場合には、まず変数の値が(演算子の結果として)使われてから、その後で変数の値が変更されます。
コード例
$a = 1;
print ++$a, "\n";  # $aに1を足して、printする

$b = 1;
print $b++, "\n";  # $bをprintして、1を足す
>  2
>  1
6. 論理演算子
「論理積」「論理和」「否定」の3つがあります。
入れ子になった条件式を使わずに、いくつかの基準に基づいて動作を決めることができます。 全体の値を求めるとき、左辺の評価だけで、右辺の評価を省くことのできる場合があります。
構文例 名称 結果
$a && $b
$a and $b
論理積 $a が「真」なら $b、そうでなければ $a
$a || $b
$a or $b
論理和 $a が「偽」なら $a、そうでなければ $b
! $a
not $a
否定 $a が「真」でなければ「真」
コード例-1
$a = 1;
$b = 5;

print $a && $b, "\n";
>  5
コード例-2
# open成功(data.txtの読込成功)ならば openを実行
# open失敗(data.txtの読込失敗)ならば dieを実行
open(FH, "data.txt") or die;
7. 比較演算子
2つのスカラー値(数値または文字列)を比較し、判断するための演算子です。
意味 数値 文字列 内容
より小さい $a < $b $a lt $b $a が $b より小さければ真
より大きい $a > $b $a gt $b $a が $b より大きければ真
より小さいか等しい $a <= $b $a le $b $a が $b より小さいか等しければ真
より大きいか等しい $a >= $b $a ge $b $a が $b より大きいか等しければ真
等しい $a == $b $a eq $b $a と $b が等しければ真
等しくない $a != $b $a ne $b $a と $b が等しくなければ真
比較 $a <=> $b $a cmp $b $a と $b が等しければ 0
$a が大きければ 1
$b が大さければ -1
コード例
$age = 21;

if ($age >= 20) {
	print "成人\n";
} else {
	print "未成年\n";
}
>  成人
pagetop

2-4. chop関数とchomp関数

スカラー変数に対する便利な組み込み関数に、chop関数とchomp関数があります。
chop関数 引数として与えられたスカラー変数の末尾の「1文字」を取り除く
chomp関数 引数として与えられたスカラー変数の末尾の「改行文字」を取り除く
以下に例を見てみましょう。
chop関数の場合は、末尾の1文字を取り除きます。
$word = "Hello\n";
chop($word); # $wordの中身は「Hello」になる
$word = "Hello";
chop($word); # $wordの中身は「Hell」になる
これに対して、chomp関数の場合は、末尾の改行のみを取り除きます。
$word = "Hello\n";
chomp($word); # $wordの中身は「Hello」になる
$word = "Hello";
chomp($word); # $wordの中身は「Hello」のまま変わらず
これらの関数の用途としては、末尾の改行を取り除くケースがほとんどです。 末尾が改行かどうか疑わしい場合には、chomp関数を使用したほうが無難であることは言うまでもありません。
また、引数が省略された場合には、特殊変数 $_ が引数として指定されたものと解釈されます。
open(IN,"data.txt");
while(<IN>) {
	chomp; # 引数を省略した場合は、chomp($_); に同じ
	my ($a,$b,$c) = split(/\t/);
pagetop