アプリ版:「スタンプのみでお礼する」機能のリリースについて

「とほほ」さんのgif画像連結ライブラリを使ってカウンタを作成中、行き詰ってしまいました。

下のスクリプトはあるサイトで配布されているカウンタのスクリプトの一部です。

1 while (length($count) < $fig) { $count = '0' . $count; }
2 $length = length($count);
3 @GIF=();
4 foreach (0 .. $length-1) {
5 $n = substr($count,$_,1);
6 push(@GIF, "$imgdir/$n\.gif");
7 }
8
9 print "Content-type: image/gif\n\n";
10 binmode(STDOUT);
11 print &gifcat'gifcat(@GIF);

* $figはカウンタ表示桁数です。
* $imgdirはカウンタ画像のディレクトリです。

このスクリプトを組み込んだらうまいことカウンタを表示することができました。
でもスクリプトの理解ができず悩んでいます。
お暇がありましたらぜひ教えてください。

A 回答 (2件)

1行目は、カウント値が桁数に満たない数値の場合「0」で埋めるってこと。


つまり、4桁と指定しておいてカウント値が3であれば、
$countは0003となります。

2行目はカウンタの桁の取得。
4と決まっているように見えてもカウンタ値が進めば、45233なんて5桁になりますからね。

3行目は配列GIFをリセット。

4行目からは、桁数の数だけ繰り返しを行い、
先頭の数値から順番に配列に入れていく。
これは、gifcatの方で使うため。
つまりgifcatで連結するためにどの画像かということを用意している。

9行目からは、GIFファイルとして出力するためのヘッダ。//text/plainとかと同じようなもの。
10行目はWindowsサーバの場合はこうする必要がある。
11行目はgifcatの連結処理を使って連結したものを出力ってこと。

それぞれの関数などは、とほほのWWW入門さんのPerlのリファレンスを見ると良いでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おかげで大まかな流れをつかむことができました。

4行目以降のブロックも、いろいろとwebをめぐって理解することができました。

ありがとうございました。

お礼日時:2004/02/15 02:56

まとめてしまえば、次の3つのことをおこなっています。


・指定桁数より短い数字なら0を追加。ex.44->00044
・数字一つ一つを区切って、ファイルアドレスの列に。
 00044 -> 0.gif 0.gif 0.gif 4.gif 4.gif
・そのアドレスの列をgifcatに渡して連結。
 (11行目で渡す部分までですね)

おおまかな流れが押さえられれば、
あとは自分なりに同じ事を実現できるように書ければ問題ないと思いますよ。

多かれ少なかれ人の書いたソースは読みにくいものですから、
無理に完全に理解しようとすることも無いと思います。


正直、コーディングがわかりにくい気がしますけれど(苦笑)
(あくまで私個人の主観ですのでこれもお気になさらずに・・)
whileループで0を埋めて、後から長さを取得するより、
長さを取って、足りない分を埋める方がわかりやすい気がします。
#5桁以上
my $length = length($count);
$count = '0' x (5-$length) . $count;

foreachよりfor文使う方が素直な気がしますし、
そもそも、foreachとsubstr使わずに、splitする場面のような気がします。
(splitすると@gifにpushしにくいということなんでしょうか・・)


結局の所、前半は面倒なことをしなくてもsprintfの用法そのままですし、
全部まとめて一文で書けてしまうのですが。
(コード読みやすくするためにわけることには賛成です)
my @gif = map {"$_.gif"} split //, sprintf("%0$fig\d",$count);

#蛇足部分が長くなりましたm(_ _)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

>多かれ少なかれ人の書いたソースは読みにくいものですから、
>無理に完全に理解しようとすることも無いと思います。

初心者である私にとって参考になるご意見でした。
ありがとうございました。

お礼日時:2004/02/15 02:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!