• ベストアンサー

use constantの意味が分からない

以下の use constant SMAX => 50;とuse constant CMAX => 10; を $SMAX = 50; $CMAX = 10; に変更し、if ( SMAX < $max ) { $n = $max - SMAX; }も if ( $SMAX < $max ) { $n = $max - $SMAX; } と変更しましたが、機能してませんでした。 どこが間違っておりますでしょうか? 宜しくお願いします。 以下がCGIです。 #!/usr/bin/perl # 保存するコメント数 use constant SMAX => 50; # 表示するコメント数 use constant CMAX => 10; #----------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST"){ read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } @list = split (/&/,$buffer); foreach (@list){ ($key,$value) = split (/=/,$_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/ pack ("C",hex($1))/eg; $getdata{ $key } = $value; } $x = $getdata{ 'px' }; $y = $getdata{ 'py' }; $comment = $getdata{ 'com' }; $file = 'comment.dat'; open (IN,"$file"); @list = <IN>; close (IN); chomp(@list); $max = @list; if ( $x != '' ){ $writedata = $x.'<>'.$y.'<>'.$comment; if ( SMAX < $max ) { $n = $max - SMAX; } else { $n = 0; } open (OUT,"> $file"); flock(OUT,2); for ( ; $n < $max; $n++ ) { print OUT $list[$n]."\n"; } print OUT $writedata; close (OUT); } if ( CMAX < $max ) { $n = $max - CMAX; } else { $n = 0; } print "Content-type: text/html\n\n"; for ( ; $n < $max; $n++ ) { print $list[$n]."\n"; } if ( $x != '' ){ print $writedata; } exit ;

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

本題に関していえば, 最後に print するときに $n もついでに表示するとなにかわかるかもしれないです. あと #4 で書いたことだと, push を使うと配列の末尾にデータを追加することができます. つまり, push @list, "$x<>$y<>$comment"; とやると @list の末尾に "$x<>$y<>$comment" が追加されます. なので if ($x ne '') { push @list, "$x<>$y<>$comment"; shift @list if $SMAX < @list; open(OUT, '>', $file); flock(OUT, 2); print OUT map { "$_\n" } @list; close(OUT); } で最初の if に関しては終了. あとはこの @list の最後の方を表示すればいいんじゃないかな.

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.6

> 表示する数は10個を設定しているのに1個しか表示できないのです。 > if ( $SMAX < $max ) { $n = $max - $SMAX; } > if ( $CMAX < $max ) { $n = $max - $CMAX; } > の「<」と「-」が怪しいのでは、と思ってます。 if 文自体に問題があるとは思えません。print 文を使って、変数の中身を確認してみてはどうで しょうか。 > if ( $CMAX < $max ) { $n = $max - $CMAX; } > else { $n = 0; } > > print "Content-type: text/html\n\n"; > for ( ; $n < $max; $n++ ) { > print $list[$n]."\n"; > } 上記の書き方は、HTML タグが含まれていないのでブラウザの表示が非常に見にくいと思います。 print $list[$n]."\n"; の \n はブラウザのソースが改行されるだけであり、($list[$n] に HTML タグが含まれていなければ) ブラウザの表示上は改行されません。たとえ 10 個が表示されたとし ても、まとめて1行で表示されることになります。少し書き直してみましたので、参考にしてみて ください。 if ( $CMAX < $max ) { $n = $max - $CMAX; } else { $n = 0; } print "Content-type: text/html\n\n"; print "<p>\$n($n) = \$max($max) - \$CMAX($CMAX)</p>\n"; print "<ol>\n"; for ( ; $n < $max; $n++) { print "<li>$list[$n]</li>\n"; } print "</ol>\n";

nkmyr
質問者

お礼

Tacosan様、kumoz様 おかげ様でうまくいきました。 このCGIは直接FLASHに値を引き渡すためでした。 print "<ol>\n";とprint "<li>を削除しました。 use constantの意味を知りたかったのですが、道がそれてしまったんですが、ずいぶん勉強になりました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ああ, comment.dat は書き換えてますね. すみません. #3 は勘違いしてました. とはいえ, SMAX, CMAX を直せば動くはずなんですけど.... あれ? $writedata の末尾に改行は入っていますか? 入らないときちんと動作しないような気がしますが.... なお, プログラムとしては $x ne '' のときに @list を変更する形にした方がきれいだと思います (<というかそうなっていないので #3 で勘違いした).

nkmyr
質問者

補足

「$writedata の末尾に改行」と「@list を変更する形」ってどんな風に記述すればよいのでしょうか? すみませんが、勉強中の身なので詳しくはないんです… 宜しくお願いします。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

とりあえず全然関係ないところから指摘すると (2か所の) if ( $x != '' ) はおかしいですね. != は数値を比較する演算子ですから, '' と比較するというのは何か混乱しているように見えます. 意味的には if ($x ne '') としたかったのかなぁ? さておき本題: ファイル comment.dat の内容を確認してみてください. @list を変更しているようには見えないんだけどいいのかなぁ....

すると、全ての回答が全文表示されます。
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

> 以下の > use constant SMAX => 50;とuse constant CMAX => 10; を > $SMAX = 50; > $CMAX = 10; > に変更し、if ( SMAX < $max ) { $n = $max - SMAX; }も > if ( $SMAX < $max ) { $n = $max - $SMAX; } > と変更しましたが、機能してませんでした。 全角の $ を使っているのが気になるのですが、まさかとは思いますが ?

nkmyr
質問者

補足

すみません。全角で使っていますが、プログラムの方はちゃんと半角です。 気になる点は 表示する数は10個を設定しているのに1個しか表示できないのです。 if ( $SMAX < $max ) { $n = $max - $SMAX; } if ( $CMAX < $max ) { $n = $max - $CMAX; } の「<」と「-」が怪しいのでは、と思ってます。 宜しくお願いします。

すると、全ての回答が全文表示されます。
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

if ( SMAX < $max ) { $n = $max - SMAX; } の方は変更したけれど, if ( CMAX < $max ) { $n = $max - CMAX; } の方は変更していない。 とおっしゃっているのだという理解でいいですか?

nkmyr
質問者

補足

返答をありがとうございます。 if ( SMAX < $max ) { $n = $max - SMAX; } if ( CMAX < $max ) { $n = $max - CMAX; } 両方とも変更しました。(単なるコピペのミスでした) 宜しくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A