numericイジハピ!TwitterID:@query1000こと深沢千尋のブログです。♡さいきんブログの評判が意外と気になるようになってきました。numericカテゴリすぐわかる気がするPerlquery1000Comment(0)Trackback(0)Perlのエラーメッセージのコーナー。Perlのエラーメッセージが表示される最小のプログラムを書いて、どういうときにどう怒られるかを研究する。numericである。これはSVCの第2文型の否定形だ。"%s"V(動詞)isn'tC(保護)numeric訳すと「引数%sは数値ではない(本来数値であるべきだった)」ということである。足し算とかであろうか。エラーの出ないパターンをやってみる。${weight}kg";上のプログラムは、$xというスカラーにぼくの体重82キロを書いて、さらに2を足して表示している。84kg$無事84kgになった。ここで、$weightについうっかり"two"という文字列を加算してしまったとする。${weight}kg";実行してみる。「引数"two"は数字ではない」というお題のメッセージのあとに「weightControl.plの9行目の加算(+)演算子において」というメッセージが表示されている。このメッセージは警告であって、その後82を表示する。これ、"two"という文字列を足し算に使ってるけどおかしくないですか?といいながら、ゼロを足しているのだ。"2kg"という文字列を足し算大丈夫ですか?といいながら、「2」を足している。「two」という文字列は数値コンテキストで無理やり解釈するとゼロになる。「2kg」という文字列は数値コンテキストで無理やり解釈すると2になる。ちなみに「2kg200g」も2になる。こんなの覚えたってしょうがない。「文字列を数値として使うとどうなるか」覚えて、プログラムで使っても可読性が下がるだけである。ちなみに、BASICやJavaScriptなどの言語では、+演算子が数値の加算の他に文字列の連結を兼ねている場合が多いが、Perlでは文字列の連結にはドット演算子(.)が使われる。Wallによると「数値の加算は可換(前後の引数の交換が同値)だが、文字列の連結はそうではないので、同じ演算子になるのはおかしい」ということである。2は数値で"two"は文字列であるが、引用符で囲んだ"2"は文字列であろうか数値であろうか。${weight}kg";で実行してみると、何の問題もなく2が加算される。84kg$Perlのデータは融通が効き、数値が要求される局面に文字列を渡しても、その文字列が数値として解釈できれば適宜数値として解釈する。これを数値コンテキスト(contextは文脈のこと)と言う。逆に、+演算子ではなく.演算子を使うと文字列として解釈される。これを文字列コンテキストという。${weight}kg";実行するとこうなる。822kg$八百二十二キロはやばい。"82"に"2"を連結しているのである。引用符なしの2をドット演算子に渡したらどうなるだろうか。${weight}kg";実行。822kg$つまり、数字リテラルをドット演算子に渡しても、特に怒られず、平然と文字列として結合する。いうことで・2という数値を+演算子に渡すと2を加算する(当たり前)・"two"という文字列を+演算子に渡すと、警告してゼロを加算する・"2kg"という文字列を+演算子に渡すと、警告して2を加算する・"2"という文字列を+演算子に渡すと、数字コンテキストで解釈して2を加算する・"2"という文字列を.演算子に渡すと、文字列コンテキストで解釈して"2"を連結する・2という数値を.演算子に渡すと、文字列コンテキストで解釈して"2"を連結する2という数値を文字列として扱っても"2"という文字列であろうと解釈するのは自然だから、いちいち警告せずに"2"を連結する。"2kg"という文字列を数値として扱うというのはどうするかわからないから、警告を出して2を加算する。いうことで、非対称性がある。