第2章 スカラー変数
2-1. スカラー変数とは
Perlには、スカラー、スカラー配列、スカラー連想配列という3つの基本的なデータ型があります。
この中で、スカラーデータとは、数値や文字列のような単純なデータのことをいいます。
また、プログラミングに必須の要素として、変数という概念があります。 変数とは、さまざまな値を一時的に記憶しておくために使われる「値の入れ物」のことです。
また、プログラミングに必須の要素として、変数という概念があります。 変数とは、さまざまな値を一時的に記憶しておくために使われる「値の入れ物」のことです。
Perlでは、各データ型に対応した形で、それぞれスカラー変数、配列、連想配列の3つの変数が存在し、スカラー変数とは、その中で最も基本となるもので、数値や文字列を格納することができます。
スカラー変数の名前は、$ (ダラー) + 英字1文字から始まり、それ以降は数字、英字およびアンダースコア ( _ ) を用いることができます。また大文字と小文字が区別されますので、たとえば $a と $A は別物として扱われます。
変数名に使用できる文字 | |
---|---|
$abc123 | 変数名として使用可能。 |
$123abc | 数字から始まることはできない。 |
$abc_123 | アンダースコアは使用可能。 |
$abc-123 | ハイフンは使用することはできない。 |
2-2. 数値と文字列
スカラー変数には、数値や文字列を代入することができます。
たとえば、 $x = 1; とすると、$x という変数に数値の 1 が代入されます。
たとえば、 $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
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つがあります。
入れ子になった条件式を使わずに、いくつかの基準に基づいて動作を決めることができます。 全体の値を求めるとき、左辺の評価だけで、右辺の評価を省くことのできる場合があります。
コード例-1
入れ子になった条件式を使わずに、いくつかの基準に基づいて動作を決めることができます。 全体の値を求めるとき、左辺の評価だけで、右辺の評価を省くことのできる場合があります。
構文例 | 名称 | 結果 |
---|---|---|
$a && $b $a and $b |
論理積 | $a が「真」なら $b、そうでなければ $a |
$a || $b $a or $b |
論理和 | $a が「偽」なら $a、そうでなければ $b |
! $a not $a |
否定 | $a が「真」でなければ「真」 |
$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"; }
> 成人
2-4. chop関数とchomp関数
スカラー変数に対する便利な組み込み関数に、chop関数とchomp関数があります。
以下に例を見てみましょう。
chop関数の場合は、末尾の1文字を取り除きます。
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/);