第19回 文字列の話をしよう コンテキストをふまえて

前回まで、「無名シリーズ」のお話から始まって、
Higher-Order、つまり「高階関数」の話題をお届けしていたわけですが、


今回からは、「文字列」のお話にがらりと変えていきます。
Perlでは、

my $c = 1;
my $d = 'こんにちは';

こんな風に、「数字」も「文字列」も、
スカラー変数に同じようにして代入できます。



しかし!


「数字」を扱う為の、演算子と、
「文字列」を扱うための、演算子は、
多くの場合 別々です。
(※ この事実に気づくのに僕はすごい時間がかかりました)


「数字」の足し算は、「+(プラス)」を使いますが、
「文字列」の連結は、「.(ドット)」を使います。

use strict;

my $c = 1;
my $d = 'こんにちは';

my $e = 2;
my $f = ' こんばんは';

my $g = $c + $e;
my $h = $d . $f;

print "$g", "\n";
print "$h", "\n";

結果:

3
こんにちは こんばんは

こんな感じです。


なお、文字列連結の「.(ドット)」ですが、
この記号を覚えるのがちょっとむずかしい、何故なら、他の多くの言語では、「.(ドット)」は、メソッド呼び出しを示すために使われるからです。しかし! Perl5では、「.(ドット)」は、文字列を連結するために使われています! 覚えましょう。
(※ ちなみに、Perlの時期バージョン Perl6では、 .(ドット)は、他の言語にそろえる形で、メソッド呼び出しのための記号にし、文字列連結は他の記号にお引っ越しさせるということになっています)




さて、数字の加算は、「+」、
文字の連結は、「.」というのを見てきましたが、おもしろいのはここからです。


それでは、つぎの、

「やさしいPerl検定(1) 初級」

を解いてみてください。
ビンゴ中西のほげほげ「みんなの検定」にPerlの問題を作成しました

一部、無名シリーズの問題が出ていますが、
今回注目するのは、もちろん、「数字と文字列」に関する問題です。



なぜ、そのような答えになったのでしょうか?
それは、Perlにはコンテキストがあるからです。


2008-10-12
ここでは、「スカラーコンテキスト」と「リストコンテキスト」の話をしていますが、

実は、「スカラーコンテキスト」は、
さらに、

  • 「ブール値コンテキスト」
  • 「数値コンテキスト」
  • 「文字列コンテキスト」

と、わけて考えることができます。




ですから、つぎの出力結果は、

use strict;

my @c = 1..3;
print 1 . @c;

結果:

13

文字列で、「13」となるのです。




どちらにせよ。このように、数字を文字列としてみなしたり、
文字列を数字とみなしたりして、演算するのは、かなりトリッキーです。

数字は数字同士、
文字列は文字列同士で、演算するように心がけたいものです。


それでは、また〜