※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。

■ 数値の頭を文字で埋める

さて前回、数値の頭を「0(ゼロ)」で埋める方法を解説しました。
「sprintf()」関数を使えば簡単に実現できました。
また、頭を空白で埋めるのも同じく「sprintf()」関数で可能です。

では、埋める文字がゼロや空白ではなく、普通の文字だとしたら..どうしますか?
もう、「sprintf()」という便利な関数は使えません。
そう、自分で作らなくてはならないのです。

ひとつの方法として、「length()」で現在の桁数を取得し、それに応じて「if」文で切り分けするという方法が考えられますが、この方法はスマートじゃありません。
行数も増えますし、どこにでも使えるというようなものでもありません。

今回はそういった場合に使える、ひとつのテクニックをお教えします。

【 解    説 】

まず、カウンタ値が「$totalc」にセットされていて、頭を「*」で埋める10桁の文字列を作成する場合です。
$totalc = substr("**********".$totalc,-6);

「えっ!たったこれだけ?」 って声が聞こえそうですが..(笑)
いえいえ、これでも立派なテクニックです。

例えば、「if」文を使って切り分ける方法で3桁までに対応できる処理ルーチンを考えると次のような感じですよね?
$ketat = length($totalc); if ($ketat == 0) { $totalc = "***";} if ($ketat == 1) { $totalc = "**".$totalc;} if ($ketat == 2) { $totalc = "*".$totalc;}

では、これを10桁まで対応できるように変更してみてください。
「if」文で作るとおそらく10行ぐらいの処理になり、しかも最初の「if」文は次のようにならないといけないでしょう?
その上、それ以降の記述も全部直さないといけません。
if ($ketat == 0) { $totalc = "**********";}

これでははっきり言って使い物になりません!!(苦笑

最初に紹介した方法なら、「-6」のところを「-10」にするだけで終わります。
(本当です。 試してみてください。)

この労力の違いや見やすさの違いがわかりますか?

では、上記の方法でこの前の「昨日、今日、累計を表示するカウンタの作成」を変更してみましょう。
ただ、注意点がひとつあります。
変数「$yesdc」の中には行末の改行文字が入ってるため桁数が正しく処理されないので、前もってその改行文字を取り除く「chomp」関数で補正しておきます。

なお、今回のサンプルでは排他制御(同時書き込み時の制御)は行っていません。
Windows環境の排他制御については「CGI(Perl)の予備知識」−「ファイル書き込みの排他制御」をご参照下さい。

【記述サンプル】
#!/usr/bin/perl print << "END_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>昨日、今日、累計のアクセスカウンタの表\示</title> </HEAD> <BODY> END_DOC ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $fmt0 = "%04d/%02d/%02d"; $day0 = sprintf($fmt0, $year+1900,$mon+1,$mday); $filnam = "tcntsaf.cgi"; open(FP,"<$filnam"); $filbuf = <FP>; close(FP); ($dayc, $totalc, $todayc, $yesdc) = split(",", $filbuf); if ($day0 ne $dayc){ $yesdc = $todayc; $todayc = 0; } $totalc++; $todayc++; chomp($yesdc); $filnam = "tcntsaf.cgi"; open(FP,">$filnam"); print FP "$day0,$totalc,$todayc,$yesdc\n"; close(FP); print "今日の日付:$day0<br>\n"; print "累計のカウント:".substr("******".$totalc,-6)."<br>\n"; print "今日のカウント:".substr("******".$todayc,-6)."<br>\n"; print "昨日のカウント:".substr("******".$yesdc,-6); print << "END_DOC"; </BODY> </HTML> END_DOC
◆実行結果について

上記のサンプルを「tcntsa.cgi」という名前で保存して実行してみてください。
(注意)
サーバーでテストする場合は、前もってアクセスログを記録するための、何もデータの入っていない「tcntsaf.cgi」という名前のファイルをパーミッション「666」で必ず作成しておいて下さい。

実行結果はこちらをクリックしてください。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。


page update:2010/01/23 20:32

Copyright (c) 2000-2009, all Rights Reserved & Produced by atom