| Top Page | プログラミング | Perl 目次 | prev | next | 索引 |

1. 変数,変数名,変数の値

変数とはなにか

最初に書いたように,コンピュータの中央処理装置はメモリにデータを記録したり, メモリからデータを読み込んだりできます. メモリには番地がついていますが,番地そのものを使ってプログラムを書くのは とても面倒です. Perlでは,メモリ中のデータがしまってある場所に任意の名前をつけて, この名前を介してデータの読み書きをします.

$x = 12;     #  メモリの,ある場所に $x という名前をつけ,そこに
             #  12という値を記録する. 
$x = 3;      #  メモリの,$x という名前で呼ばれる場所に,
             #  3という値を記録する.
$y = $x + 7; #  $x という名前で呼ばれる場所に記録されている値と,
             #  7 という値を足す.あらたに $y という名前で呼ぶ場所を
             #  用意して,足し算の結果をその場所に記録する.
print $y;    #  print という組み込み関数を使って,$y という名前で呼ばれる
             #  メモリの領域に記録されている値を画面に出力する.

以下では,

と呼ぶことにします.

上のプログラムのポイントを簡単に説明します.

Perlでは,# 記号があるとそこから行末までは一切無視され,プログラムの動作には 影響しません. 人間が読むためのコメントをプログラム中に書くのに利用します. なお,「プログラムは他人が読んで分かるように書くこと」「三日後の自分は他人であること」をつねに忘れず,まめにコメントを書きましょう.

文の最後にはかならずセミコロン '; ' を書きます. セミコロンが出てくるまでは,改行しててもひとつの文と見なされます. 長い文は適当なところで改行して見やすくできます.

Perlでは,ふつうの(あとで出てくる配列だのハッシュだのでない)変数の 名前は最初に $ という文字をつける決まりです.アルファベットか下線 '_' で 始まり,アルファベット,数字,下線 '_' を組み合わせた任意の長さの名前を つけることができます.アルファベットの大文字,小文字は区別されるので, $a と $A は別ものです. 名前は,内容が分かるようにつけましょう. $x や $a よりは $weight とか,$age のように.

$x = 12 の'=' は,等しいという意味ではありません. この記号の左側に名前が書かれた変数(メモリの場所)に, 右側の式を評価した結果を記録するという意味です.'=' は代入演算子と呼ばれます.

$x = 12; というところでは,メモリのある領域(どこの領域かはプログラマは知る 必要はない.Perlの処理系と OS が適当にやってくれる)を変数として確保して, ここに$x という変数名をつけています. いっぽう,そのあとの $x = 3; という文では,すでに$x という名前がついた変数が あるので,その値を 3 に書き換えます.

変数名を print という関数のうしろに書くと,その変数の値が画面に表示されます. 関数とはなにかについては,もうすぐに説明します.

数値や変数のあいだで,数値演算をすることがきます.演算の記号(演算子)には, +, -, *(かけ算), /(割り算),**(べき乗),% (剰余)などがあります. 演算子の優先順位は,数学の場合とほぼ同じです.あやしいときはカッコ()で囲むと 安全だし,読むときに分かりやすくなります.


変数の使い方

変数の扱い方の例を見てみましょう.

# アカマツの学名 Pinus densiflura を,属名 (Pinus)と種小名(densiflora) を
# つなげてつくる.

$genus = "Pinus";   #  $genus という名前の変数を作り,
                    #  そこにPinus という文字列を記録する.
                    #  文字列は引用符 "" でかこむ.
$species = "densiflora";  #  $speciesという名前の変数を作り,
                          #  そこに densiflora という文字列を記録する.
$name = $genus . " " . $species;
                    #  文字列を連結する演算子 '.' を使って,
                    #  Pinus と densiflora のあいだに空白がひとつはさまった
                    #  文字列をつくり,変数 $nameに代入.
print $name;        #  変数 $name の値を画面に出力する.

ピリオド '.' は,文字列(任意の数の文字が並んだもの)をつなぎ合わせて ひとつの文字列を作る演算子です.

文字列は,ダブルクォテーション "" でかこっても,シングルクォテーション '' で かこってもよいのですが,意味は少し違います.どう違うかはあとで出てきます.

Perl の変数には,数値でも文字列でも区別せずに代入できます. 文字列も,文脈に応じて数値として評価されます. 下にその例を示します.

$x = "12.3";
$weight = $x . " kg";   #  $weight の値は "12.3 kg"
print $weight, "\n";    #  $weight の値を画面に出力."\n"は改行.
$x_doubled = $x * 2.0;  #  $x_doubled の値は24.6
print $x_doubled, "\n"; #  $x_doubled の値を画面に出力.

数値にしろ文字列にしろ,プログラム中にじかに書き込まれた値 ($weight = $x . " kg"; の " kg"とか,$x_doubled = $x * 2.0; の 2.0 とか) は,リテラルと呼ばれます.とくに文字列の場合は文字列リテラル, 数値の場合は数値リテラルとも呼びます.リテラルは,言語によっては 「即値」とも呼ばれます.リテラルも即値もなじみのない言葉ですが, 「プログラム中に直に書き込まれた値」ということです.

またここまでの知識では,データの解析だのシミュレーション計算だのはできません. それらしい例題も作れませんが,今しばらく我慢してください.

<練習>


存在しない変数の値を呼び出すと?

代入演算子の左側に書かれた変数がまだ存在していないなら,あらたに その名前の変数が作られることはすでに説明しました. では,もし,代入演算子の右側に書かれた変数がまだ存在しなかったら どうなるでしょうか? 演算子の左側の変数に代入する値を決めるために, まだ存在しない変数にも値を持って欲しいところです.

Perl では,まだ存在しない変数の値を呼び出そうとする('参照する'と言う)と, そういう変数があらたに作られて未定義値という特別な値がセットされます. 未定義値は,数値としてはゼロ,文字列としては空(から)の文字列, 真偽値(あとで説明します)としては偽として扱われます.

存在しない変数の名前を呼ぶとただちにそういう名前の変数ができあがるのは便利なようですが, うっかり変数名を書き間違えてもエラーにならず, 期待したのとは違う結果を招いてしまうという難点もあります.

 $weight = 42;
 $double_weight = $weght * 2.0;
 print $double_weight;

このプログラム例は,42 の 2 倍の 84 が表示されることを期待して書いた ものですが,2行めの右側で, $weight と書くつもりで i を抜かして $weght と書いてしまったため, この計算式の結果は 未定義値(数値としてはゼロ)× 2 ,すなわちゼロとなります. したがって,$double_weight の値はゼロとなり,画面には 0 と表示されます.

人はかならずまちがえるものですから, 「変数名をまちがえないように注意せよ」といっても解決にはなりません. こうした誤りを避ける方法はいろいろありますが,もっとも簡単にできるのは, DOS窓でプログラムを実行するときに -w オプションをつけるという方法です. このオプションを付けると,まだ存在しない変数を参照(たとえば代入演算子 の右側に登場)したり,値を代入しながらそれっきり参照しない変数があると, それって名前の打ち間違いじゃないの?というメッセージが表示されます.

たとえば,うえの間違ったプログラムを dame.pl という名前のファイルに書き込んで

 perl -w dame.pl

のように -w オプション付きで実行すると,

 Name "main::weght" used only once: possible typo at test.pl line 2.
 Name "main::weight" used only once: possible typo at test.pl line 1.
 Use of uninitialized value in multiplication (*) at test.pl line 2.
 0

のように,メッセージが表示されます(最後の 0 は,print関数の出力です). メッセージの内容のくわしい説明はしませんが,ざっと見ればどの変数が問題か, どの行が問題かは分かるので,プログラムのそこらへんを読み直して間違い さがしをします.

※ここまで,プログラムのコメントには日本語の文字を使ってますが, データは英数字しか使っていません. 単に文字列データとして日本語を読み込んだり,表示したり, ふたつの文字列が等しいかどうかを比較したりする分には, だいたい問題はなさそうですが,文字列を操作する関数 のなかには,日本語の文字をデータとして与えたときには期待した 動作をしてくれないものもあります. また,プログラム中の文字列リテラルあるいは正規表現(ずっとあとで出てきます) に日本語の文字が含まれている場合,文字によってうまく動くこともあるし 動かない,あるいは文法エラーになってしまうこともあります.

もともと Perl の処理系は日本語の文字セットなどの多バイト文字には 対応していませんでしたが, 日本語のデータも正しく扱えるように拡張した jperl というものも作られています. また,2002年7月18日にリリースされた perl V.5.8.0では,そのままで 日本語の各コード(EUC、Shift JIS, 7bit JIS)を扱えるようになったそうです.

詳しいことは,ネットで Perl 日本語 文字コード などをキーワードにして 検索してみてください.



| Top Page | プログラミング | Perl 目次 | prev | next |