Perl入門 ≫ LESSON2 スカラー:数値

数値データと変数の基本

他のプログラミング言語では、変数に入れるデータの種類(数値や文字)などを最初に指定しないといけないものがあります。

「この変数には数値データを入れます」

といった具合です。
このときのデータの種類をデータ型といいます。数値の中でも、それが整数なのか、実数なのか、など細かく分かれる場合があります。
Perlでは、変数のデータ型を宣言する必要はありません。
最近はこういった言語が多いです。特徴の一つとして覚えておきましょう。



ではさっそくPerlで変数を使ってみましょう。
変数は、最初に使う前に「この変数を使うぜ!」と宣言する必要があります。
数値データを変数に入れる場合は、次のようにします。

my $hensu;

これで$hensuが使えるようになります。
このmyは何か、という疑問は置いておきましょう。変数を宣言する前には、これをいれるようにしてください。理由は後の項目で説明します。(実はなくてもかまいませんが、とりあえずクセ付けておくといいです)

変数宣言と同時に、数値データを変数に初期値として入れる場合は、次のようにします。

my $hensu = 100;

「=」の左の変数に、右の値を入れる(代入する)、という意味です。
この場合、変数hensu($hensu)に100が代入されたわけです。

my $hensu;
$hensu = 100;

と、先に変数宣言しておいて、あとでその変数に値を代入することもできます。

変数にあとから別の値をいれることもできます。

my $hensu = 100;
$hensu = $hensu + 1;

2行目で、$hensuの値100に1足したものを、また$hensuに設定しています。値は101に変更になりました。

変数宣言は、複数の変数を一緒に行うこともできます。

my ($hensu, $hensu2);

初期値も一緒に宣言するときは

my ($hensu, $hensu2) = (1, 2);

こうなります。$hensuに1がはいって、$hensu2に2が入ります。

ちなみに、宣言していない変数や、宣言はしてあっても値の入っていない変数を使おうとすると、エラーになります。

my $hensu;
print $hensu; #値の入ってない変数の出力
print $hensu2; #宣言のない変数の出力

どちらも出力時におかしいよ!と言われます。



数値データの応用

変数については大体理解できたと思います。変数=入れ物、ということを頭に入れて置いてください。
数値データの扱いの話に戻りましょう。

$hensuにきちんとした数字以外のものが代入されてしまった場合はどうでしょう?
例えば、

my $hensu = 100;
$hensu = 'aa';

ってなことをやると、$hensuには今まで入っていた値のかわりに文字列'aa'が入ります。
今数値100が入ってんだから、入れるなら数値にしてよ!なんて文句は言われません。

ちなみに、文字列'aa'が入った変数を数値として扱おうとすると、0と変換されます。
では、

my $hensu = '10A0';

こんなのは?
この場合、最初が数値なので10までは評価しますが、そのあと数値以外のものが出てきたので、その時点で変換をやめます。よって、この場合$hensuは数値10として評価されます。
数値として扱わなければ、ただの文字列「10A0」です。

ちょっとやってみましょう。

my $hensu = 100;
if($hensu == 100) { print "hensu = $hensu\n"; }
#変数$hensuが100だったら文書を出力します。
#\nとは改行を表します。

my $hensu2 = 'aa';
my $hensu2_1 = $hensu2 + 1;
print "hensu2_1 = $hensu2_1\n";
#変数$hensu2は数字ではないので0と認識されます。

my $hensu3 = '10A0';
my $hensu3_1 = $hensu3 + 1;
print "hensu3_1 = $hensu3_1\n";
#変数$hensu3は10として認識されます。

結果は以下。※実行すると「数値じゃない値を計算すんな!」と怒られますが、一応できます。

hensu = 100
hensu2_1 = 1
hensu3_1 = 11

まぁ普通はちゃんと数値は数値、文字は文字として扱っていくので、こんな妙な処理になることはありません。
が、perlは変数宣言にデータ型を使わなくてもよく、勝手に変換してくれるという非常にフレキシブルな言語であることがわかります。


演算子

数値と言えば計算です。perlでも数値データは計算を行う事ができます。計算のことを演算とも言います。+とか×とかですね。この記号を演算子といいます。

perlで使う演算子を紹介します。

演算子一覧
=代入
$hensu = 1;
+加算
$hensu = 1 + 2;
-減算
$hensu = 50 - 1;
*乗算
$hensu = 2 * 4;
/除算
$hensu = 100 / 2;
%剰余(余り)
$hensu = 10 % 3;
++インクリメント(1プラス)
$hensu++;
--デクリメント(1マイナス)
$hensu--;

すでに何度も出てきた「=」も演算子です。代入演算子と呼びます。 試してみましょう。++と--以外はどれもなじみがあるはずです。

my $hensu = 1 + 2;
print "1 + 2 = $hensu\n";

$hensu = 50 - 1;
print "50 - 1 = $hensu\n";

$hensu = 2 * 4;
print "2 * 4 = $hensu\n";

$hensu = 100 / 2;
print "100 / 2 = $hensu\n";

$hensu = 10 % 3;
print "10 % 3 = $hensu\n";

$hensu = 100;
$hensu++;
print "100 ++ = $hensu\n";

$hensu = 100;
$hensu--;
print "100 -- = $hensu\n";

結果は以下。

1 + 2 = 3
50 - 1 = 49
2 * 4 = 8
100 / 2 = 50
10 % 3 = 1
100 ++ = 101
100 -- = 99

もちろん、計算の対象は変数でもかまいません。

my $v1 = 2;
my $v2 = 4;

print $v1 * $v2;

結果は2×4で8が出力されます。



代入演算子

数値は変数に代入できますが、変数に演算を行う場合、代入記号(=)の前に演算子を同時に書くことができます。

+=加算
$hensu += 2;
($hensu = $hensu + 2;の意味)
-=減算
$hensu -= 1;
($hensu = $hensu - 1;の意味)
*=乗算
$hensu *= 4;
($hensu = $hensu * 4;の意味)
/=除算
$hensu /= 2;
($hensu = $hensu / 2;の意味)
%=余り
$hensu %= 3;
($hensu = $hensu % 3;の意味)

実行してみましょう。

my $hensu = 3;
$hensu += 2;
print "\$hensu = $hensu\n";

$hensu -= 1;
print "\$hensu = $hensu\n";

$hensu *= 4;
print "\$hensu = $hensu\n";

$hensu /= 2;
print "\$hensu = $hensu\n";

$hensu %= 3;
print "\$hensu = $hensu\n";

結果は以下。

$hensu = 5
$hensu = 4
$hensu = 16
$hensu = 8
$hensu = 2



8進数、16進数

perlでの数値は普通10進数で表します。
が、8進数・16進数として表現することもできます。

普通

10

とだけ書くと、10進数の10ということになります。
ですが、

010

と、数字の最初に0を付けるとそこから後の数字は8進数と見なされます。
この場合は8進数の10ですので、これは10進数の8にあたります。

0x10

数字の最初に0xを付けるとそこから後の数字は16進数と見なされます。
この場合は16進数の10ですので、これは10進数の16にあたります。

8進数、16進数

普通実生活でよく使われてるのは10進数ですね。
1,2,3,....,9で、一桁あがって10,11,12,....。
10という一まとめで次の桁に上がります。

では、8進数は1,2,3,..,7で、次に一桁上がって10,11,12,...となります。 0から7までの数字で表現されます。

16進数は同様に1,2,3,..,9,10,11,..,15で、一桁あがることになります。 が、10の時点でもうすでに次の桁にいっちゃってるので書くのに困ります。
では、1,2,3,..,9,の次は10を表す数字のかわりにAと書きましょう。同様に11はB、12はC,..,15はF。それでやっと一桁あがるので10(16進数表現)というのが10進数で言うと16にあたります。

あまり使わないので説明はこのへんで。興味ある人は文献や他のサイトをあたってください。



実行してみましょう。

my $hensu = 10;
print "\$hensu = $hensu\n";
#10進数

$hensu = 010;
print "\$hensu = $hensu\n";
#8進数で10(10進数では8)

$hensu = 0x10;
print "\$hensu = $hensu\n";
#16進数で10(10進数では16)

結果は以下。

$hensu = 10
$hensu = 8
$hensu = 16

わかったでしょうか?
スクリプトの中では、確かに数値は8進数・16進数で認識されますが、 printコマンドで出力する場合、特にフォーマットを指定しない限り10進数で出力されてしまいます。



ページのトップへ戻る