今回も Perl に関する基礎的な事項について学んでいきます。 先週は用事があって急いだのでせわしなくて申し訳ありませんでした。 今回はのんびりやりましょう。
前回、「関数」というものを習いました。数学の関数と比較して、 似ているところ・異なるところがあるのを覚えていますか? 今回は「データ」「変数」について学びます。
前回はprintという関数を学びましたが、 この関数は複数の引数をとることができました。 引数には次のようなものがありました。
- 110 とか 3 のような数値データ。
- "はじめてのPerl\n"や"1+2"のような文字列データ。
- それらから「演算」によって作り出されたデータ。例えば 1+2。
Perlでは数値データと文字列データを必要に応じて自動的に変換する機能が 備わっています。 例えば次のような内容のスクリプトnm004.plを実行すると、 画面にはなにが表示されるでしょう。 (注:先頭の「1: 」は行番号を示すためにつけてあります。 これはスクリプトの一部ではありませんから、入力しないで下さい。)
1: print("123" + 45);実際に実行すると168という数字が表示されます。 つまり"123"は文字列なのですが、+ という演算子が 後に続くので、Perlが「あぁ、これは数値として取り扱って欲しいんだな」 と解釈して123という数値とみなされ、それが45に足されて 168になるわけです。
以上の「数値」「文字列」のデータを「スカラー」と呼びます。 スカラーを並べてコンマで区切って並べたものを「リスト」 または「ベクター」といいます。 例えば、(1,2,-3)や("山崎", "正之", 50)はリストです。 ちょうど線形代数で出てくる 「スカラー」と「ベクトル」の関係になります。 リストは丸括弧で囲みますが、省略することもできます。
「変数」とは、データを格納するものです。 変数には
があります。変数名は上の3種類を区別するため、 接頭文字 $, @, % ではじめ、 そのあとに英数字や記号(_も含む)を並べます。 ただし接頭文字のあとにすぐ数字や_など特殊なものを続けたものは すでにシステムが予約している特別な変数と重なることがあるため、 自分用の変数の名前には「英数字と_」のみを用い、かつ 接頭文字のあとには「数字や_」は使わないことにします。
- スカラーを格納する「スカラー変数」
- リスト(ベクター)を格納する「配列」
- 文字列を添え字とする「ハッシュ変数(連想配列)」
特殊変数の例:$1 $2 ... $9 $_ $. $, $? $[ $] .....変数に値を代入するには、代入演算子 「=」を使います。 左辺に右辺の値を代入する働きをもっています。 数学での等号とは意味が違うので注意して下さい。
よく使う演算子には次のようなものがあります:
演算子 説明 使用例 = 代入 $a = 10 +
-
*
/加算
減算
乗算
除算$a + $b % 除算の余り $a % $b ** べき乗 $a ** 3 . 文字列の連結 $filename . ".bak" x 文字列や配列の繰り返し "abc" x 4
("abc") x 4++
--インクリメント
デクリメント++$a
$a++&&
||論理積
論理和($a > 0) && ($b > 0) ==
!=数値として等しい
等しくない$a == 0 <
>より小さい(数値として)
より大きい(数値として)$a > 0 <=
>=より小さいか等しい(数値として)
より大きいか等しい(数値として)$a >= 0 eq
ne文字列として等しい
等しくない$str eq "abc" lt
gtより小さい(文字列として)
より大きい(文字列として)$str lt "abc" le
geより小さいか等しい(文字列として)
より大きいか等しい(文字列として)$str ge "abc" =~ パターンマッチ, 変換, 置換 $str =~ m/abc/ 以下のようなスクリプトをメモ帳で作成し、nm005.pl という名前で 保存します。
1: $a = 123; 2: $b = 45; 3: $c = "123"; 4: $d = "ab"; 5: print($a + $b, "\n"); 6: print($a - $b, "\n"); 7: print($c . $d, "\n"); 8: print($d x 4, "\n"); 9: print(($d) x 4, "\n"); 10: print($a == 0, "\n"); 11: print($a != 0, "\n");どうなりましたか? 出力が納得できますか? 式を変えたり、上の表の他の演算子を使って上のスクリプトにさらに行を追加したりして 実行してみましょう。 そのスクリプトとその実行結果を自分のページに載せて下さい。 (締切は日曜日)
(注)
- 前回のスクリプトでは、計算結果だけでなく元の式も表示させていました。 それをまねすれば、今回も単に計算結果だけでなく、読みやすい形に表示することができます。 例えば
print("$a + $b = ", $a + $b, "\n");
と記述してみます。仮に $a および $b の値が上の例の通りとして、これを実行すると
$a + $b = 168
とはならず、
123 + 45 = 168
と出力されます。これは二重引用符号で囲んだ文字列において、変数はその値で置換される というきまりがあるからなのです。 もしこのような置換を望まないならば、文字列は二重引用符号「"」ではなく、 一重引用符号「'」で囲みます。
ついでに最後の"\b"を、'\n'に変えるとどうなるかも、試して下さい。
- 計算結果の桁数が大きくなるときがあります。例えば、
print 2**100;
を実行すると
1.26765060022823e+030
となりますが、これは1.26765060022823x1030という意味です。
- 上の表のほとんどは二項演算子で、
(データ) (演算子) (データ)
のパターンで使います。インクリメント演算子+とデクリメント演算子--は例外で、
(データ)(演算子)
(演算子)(データ)
のパターンで使います。通常演算子とデータの間には好みに応じて半角スペースを入れることが できますが、インクリメント演算子、デクリメント演算子の場合は、間にスペースを入れないようにします。
- 複数の演算子を含む式においては( )で囲まれた部分の計算が優先され、 先に計算されます。それ以外は、あらかじめ定められた優先度の序列に従って計算されます (Core Perl Docs の perlop を参照)。 例えば、
$a = $a + 1;
という式は
$a = ($a + 1);
と同じで、$a + 1が先に計算され、その値が左辺の$aに 代入されます。もし
($a = $a) + 1;
という風に括弧をつけると、例えば $a に 123 という数値が格納されているとすると、 先に$a = $aの部分が計算されます。このとき右辺の値 123 が左辺の変数 $a に代入されますが、この式全体の値は、その123になります。それに1が足されて、 全体の値は124になります。
- 上の表で「==」から一番下までは、比較演算子です。 比較演算子は True/真 か False/偽 のどちらかの値を返します。 文字列の場合は""(空文字列)および"0"のふたつがFalse/偽 です。 数値の場合は0はFalse/偽 です。 これら以外は皆 True/真 です。1がその最も代表的な例です。 色々な左辺や右辺を用いて、これらの比較演算子がどのような値を返すのか調べてみましょう。 また文字列を比較する演算で、間違って数値を比較するとどうなるか、その逆はどうかなど、 調べてみましょう。
- 表の一番下の「=~」はかなり複雑な演算子です。簡単な使い方としては
文字列 =~ m/パターン/
のようなものがあります。これは左辺の文字列が右辺で指定したパターンにマッチしていれば True、 そうでなければ False になります。例えば、
"01aabcdef" =~ m/abc/ は True ですが、
"0a1bcdef" =~ m/abc/ は False です。
「m」はマッチングmatchingのmです。 パターンの指定の仕方は後日詳しく説明します。
- なにかエラーがあるとき、エラーメッセージは英語で表示されます。 いくつかの用語を紹介しておきます: string = 文字列, operator = 演算子, function = 関数
またメッセージは主語や動詞、冠詞などが省略されることがありますので、適当に補って読みます。
例: String found where operator expected at nm005.pl line 8, at end of line (Missing semicolon on previous line?) Can't find string terminator '"' anywhere before EOF at nm005.pl line 8.---> String is found where operator is expected at nm005.pl line 8, at end of line (Is there a missing semicolon on previous line?) I can't find string terminator '"' anywhere before EOF at nm005.pl line 8.(さらに冠詞も補ってみましょう)
[リストの要素]
リストから要素を取り出すには後ろに[n]を付けます。 n は0 以上の整数で、先頭からの位置を示します。 一番先頭が0で、次が1、その次が2、…と続きます。 例えば、リスト
("日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜")
の場合となります。
- ("日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜")[0] の値は"日曜"
- ("日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜")[1] の値は"月曜"
- ("日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜")[2] の値は"火曜"
- ……
@youbi = ("日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜");
などとして配列@youbi を定義した場合は、これらを$youbi[0], $youbi[1], $youbi[2], ……というふうに表すことができます。 (先頭の記号が@ではなく$になることに注意してください!!) 逆に
$youbi[0] = "日曜"; $youbi[1] = "月曜"; $youbi[2] = "火曜"; ……
という風に配列の要素を定義することもできます。
[リストの略記法]
1ずつ増加する整数列のリスト、例えば (2, 3, 4, 5, 6, 7, 8, 9) は (2 .. 9) のように略して書くことができます。