ん、違う?

ではでは

#!/usr/bin/perl -w

use strict;
print '"K\'s Style"';
exit;

を実行してみよう。結果は同じだけれどソースが何か違うはずだ。気付いたかな?気付くまで進まないでね。

print '"K¥'s Style"';

「'」と「"」の使い方がちがうでしょ?

実はPerlを使い始めて結構経つ人でもあいまいな人が多いんだ。こいつ達を使い分けているソースを見るとkimiは「おっ」と思う。

CGIなどのweb上で不特定多数が使うプログラムなどは特に気にした方がセキュリティ面でも少し安心。

「'」で囲むとただの文字列、「"」で囲むと実行できるところは実行してしまうんだ。

ためしにprintのところを

print '"K\'s Style\n"';

print "\"K's Style\n\"";

で試してみよう。後者の方は変な改行が入ったでしょ?「¥n」とはエスケープシーケンスで改行を表すんだ。だから「"」で囲めば実行して改行してしまう。

で、この違いを知らないとなんだか無理やりっぽいソースになる。このことを知らなくて何とか実行できるように改良?を繰り返したであろうソースをたまに見ることがあるから、最初から知ったあなたは無駄な時間と労力をかなり得したであろう。

いや、ほんとうに!たまにフリーのCGIを公開している人でも結局全部「"」にしてごまかしている。不特定多数の人が実行できるプログラムで、任意に入力できる文字列をそのまま「"」に含むとは・・・意味わかるかな?気をつけてね。そんなプログラム使わないでね。

おそらくCGIを作りたくてここを読んでいる人が多いと思うから、ちょこちょこセキュリティについても書いていこうと思う。

ちなみに「"」で括ったときはカッコ内の「"」をエスケープして、「'」で括ったときはカッコ内の「'」をエスケープするんだ。ま、当然だね。

ややこしい!

要はこいつが理解できるようになればよい。わざとしつこい位わかりにくくしてあるよ。

「$」とは次の連続文字列が変数だと言うことを表す。変数名はアンダーバー(_)と半角英数文字が使えて、数字以外から始められる。「my $n」とはnと言う変数を使いますとperl.exeに宣言して(教えて)いるんだ。あと、「=」は代入と言う意味で、左辺に右辺を入れるという意味。左辺の中身は右辺と同等となり、左辺も右辺と同じように扱えるようになる。代入は宣言時にもできるんだ。

代入しないこともできる。そのときは「my $n;」とす。この状態で注意することは「空」の変数ではなく「未定義」の変数で中身は未定義値という意味のundefと同じだ。「空」の変数を宣言したければ「my $n = '';」、ゼロにしたいなら「my $n = 0;」ときちんと宣言しよう。undefのまま使うと思わぬバグに悩むことになると思う。

ヒントは

・「+=」は左辺(自分)に右辺を足すって意味だよ。

・「.」は結合って意味だよ。

・「¥t」はタブって意味だよ。

#!/usr/bin/perl -w
=pod
文字列と数字
簡単な演算子
=cut

use strict;

my $n = 1;
print "$n"."\n";
print '$n'."\n";
print "$n+$n"."\n";
print "\$n+$n"."\n";
print '\$n+$n'."\n";
print '"\""'."\n";
print "'\''"."\n";

my $d = 1;
$d = $d . $d + $d;
$d = $d . 10 + $d + $d;
print "$d"."\n";

my $t = 1;
$t = $t.$t+$t.$t+$t+$t.$t+$t+$t+$t;
print "\t"."$t"."\n";

$n = $n+$n+$n+$n;
$n = $d.$t+($n.$n.$n.$n).$n+$n+$n/$n.$n-$n;
print "$n"."\n";

$n = "1K2'3s4S5t6y7l8e9";
$n += $n;
print "$n"."\n";

exit;

を実行してみよう。思い通りの結果かな?警告が出ると思うけど一応動くはず。動かない時は32行目をコメントアウトしてね。

今までの解説とヒントで解読できるはずだ。わかったらLesson3へいこう。ではがんばって!

 

Lesson2は終わりだね。え、手抜きだって? ↑のソースは書く方もめんどくさいんだよ・・・手抜きではないさ。