Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0046nobodyさん
2005/08/13(土) 22:25:49ID:???回答は出たようなので補足だけ。
検索キーワードは「レスポンスヘッダ」とか。
あとhttpdのエラーログも見よう。
004742
2005/08/13(土) 22:30:43ID:???そうなんですか!
確かにそう考えるとコメントアウトしてエラーとなる原因がよく分かりました。
>>44
すみません。perlを用いたwebプログラミングの文法に関するものということで
ここで質問してしまいました。
スレ違いということであればどこが妥当でしょうか?
「CGIだけど、なんか質問ある? Part 12」は微妙に違うような気がしますし...
0049nobodyさん
2005/08/13(土) 23:05:20ID:???お騒がせしましたー・・・
0051nobodyさん
2005/08/13(土) 23:13:47ID:???もしdata.datの内容が以下のような場合でも、
きちんと展開されるには、どんな正規表現にすればいいでしょうか。
[data.dat]
a + b = $a + $b です。
005339
2005/08/13(土) 23:26:04ID:???\$.+$のままだと、「$a + $b です。」にマッチして、そのままevalかけるらしく、
正確な「30 です。」という結果にならないのです(´・ω・)
変数名のみ(演算子があればそれも)ってのは、やっぱり無理なんでしょうかね・・・
一応、例に出しているのはあくまでも例で、
実際は$data{name}といった内容がかかれているのです・・・。
0054nobodyさん
2005/08/13(土) 23:26:59ID:???正確に言えばそこだけど、
違いが分からないんだから初心者向けのこっちのスレが融通利かせてもいいと個人的には思う。
>>51
どの範囲を式として見るか不明瞭。
とりあえず変数と変数に挟まれた+を認識させるなら
s/(\$\w+([ +]+\$\w)*)/eval($1)/ge;
ただし $a + + $b なんてあっても無視。
式として見る範囲に記号付ける方が無難かもね。
「a + b = <$a + $b> です」
s/<([^>]*)>/eval($1)/ge;
0056nobodyさん
2005/08/14(日) 00:18:03ID:???$a=10; $b=20;
open(D, "<data.dat");
$data = join("\n", '$result=<<EOS', <D>, "EOS\n");
eval $data;
print $result;
0057nobodyさん
2005/08/14(日) 00:57:57ID:gpI3KnsY$BBS_TITLE="Fighter's BBS 戦士たちの会議室";
これを投稿フォームの上部に表示させているのですが、(投稿フォームのところに$BBS_TITLEと)
投稿すると$BBS_TITLEの部分だけ文字化けします。
"を'に変えてみたり、漢字をエスケープさせてみたりしましたが
直りません。
どこをどうしたら表示できるようになるでしょうか。
スクリプトはS_JISです。
0059nobodyさん
2005/08/14(日) 01:55:41ID:???HTMLソースから文字化けしている部分をさらすよろし。
よくあるShift-JISうんぬんの話じゃなさそうだから。
0060nobodyさん
2005/08/14(日) 02:30:51ID:RsCEyCku話はそれから。
0061nobodyさん
2005/08/14(日) 03:16:43ID:???IANA 的には "Shift_JIS"
http://www.iana.org/assignments/character-sets
Encode 的には "shiftjis"
http://search.cpan.org/~dankogai/Encode-2.11/JP/JP.pm
Encode だとエイリアスしてくれているので通るとは言え、
ハイフン区切りで書く癖があるなら直した方がいいよ。
0062掲示板タイトルの文字化けの件
2005/08/15(月) 02:34:48ID:B8RuptAe名前やレスを下さった方のお名前がわかりませんがお許しください。
>(化けたソースを)UP
・・・しろとのことでしたのでUPします。
Fighter's BBS 戦士達の会議室 となるべきところが↓
Fighter's BBS $B@o;NC#$N2q5D<<(B
このようになっております。
文字列内の'を消しても変化ありません。
投稿したときだけこのように表示され、掲示板へアクセスしただけの時は
正常に表示されます。
0063nobodyさん
2005/08/15(月) 02:48:09ID:???0064nobodyさん
2005/08/15(月) 08:24:12ID:I9dGlG0tあんがと。
shiftjis /\bshift.*jis$/i Shift JIS (aka MS Kanji)
適当に打っても通るから適当に打って投稿しますた。
0065nobodyさん
2005/08/15(月) 08:36:29ID:???文字コードの指定がないか、ばらばらなんでしょ。
自作掲示板ならソースのコードを統一する。
レンタルなら借りた先に文句を言う。
無料DLして設置したのなら作者のページで質問する。
0066nobodyさん
2005/08/15(月) 09:04:11ID:???ソースファイルの保存コードがおかしいのかも。
外部ファイルrequireして読み込んでね?
use encoding '****';してその文字コードにソースを統一しる
0067nobodyさん
2005/08/15(月) 17:51:57ID:???0068nobodyさん
2005/08/15(月) 18:54:55ID:VKc1C+7ucookieのセットを以下のように行い、\cookiesフォルダにもファイルが出来ている
のに、$ENV{'HTTP_COOKIE'}にデータが返ってきません。どうしてでしょうか?
ちなみにIEのプライバシー設定は”自動cookie処理を上書きする”にして
います。
print "set-cookie: ", "DI=$FORM{'id'}; ";
print "expires=", "Sat, 31-Dec-2006 23:59:59 GMT; ";
print "domain=", "abcd.jp; ";
print "secure", "\n";
スレ違いだったらすいません。
0069nobodyさん
2005/08/15(月) 19:37:06ID:???この2つ。ちゃんと理解してる?
0070nobodyさん
2005/08/15(月) 22:44:30ID:VKc1C+7u68です。
ありがとうございます。
みようみまねでやっていたので、理解してませんでした。
おっしゃる通りにやったらうまく行きました。
0071nobodyさん
2005/08/16(火) 02:21:29ID:CqLOGoiCrequire は if 文の中にもかけますか?
PCと携帯に対応したBBSのソースをダウンロードしたのだけど
1ファイルで if 文でなんとかしようとしてる感じの代物でした。
それよりPC、携帯ごとに同名の関数を別ファイルで定義して
メインのCGIは最初に端末を判断してrequireでファイルを読み込んだ方が
OOP的で保守性もいいと思ったのですが、可能なんでしょうか。
アイディアがどうかも含めてご意見お願いします。
0072nobodyさん
2005/08/16(火) 02:30:11ID:???0073nobodyさん
2005/08/16(火) 03:14:09ID:???0074nobodyさん
2005/08/16(火) 10:26:34ID:???cat index.html | nkf -Se -Lu | sed 's/<\/.*>//g; s/<.*>//g; s/^$//; s/ \;/ /g;'
↑このスクリプトを詳しく教えてほしいです。
0075nobodyさん
2005/08/16(火) 13:09:30ID:???以下のスクリプトで %temphash を使わずに
無名ハッシュにスライスで代入してそのリファレンスを配列に追加するにはどうしたらいいでしょうか?
my @examplenames = qw/Server Board Key/;
my %temphash;
@temphash{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
push @favorites, \%temphash;
007675
2005/08/16(火) 13:33:31ID:???@{$favorites[++$#favorites]}{ @examplenames } = ("pc8.2ch.net", "php", "1123777607");
0077nobodyさん
2005/08/16(火) 14:04:58ID:9v1kpORvそれはシェルスクリプトだから、マニュアル引くならman。
それほど難しい所は無いから、cat,nkf,sedをググってみては。
>>75
こういうのを知りたかったのかなと思ったのだけど、
スライス使ってないから悩んだ。
push @favorites, {Server=>"pc8.2ch.net", Board =>"php", Key=>"1123777607"};
0078nobodyさん
2005/08/16(火) 14:08:50ID:???0079nobodyさん
2005/08/19(金) 14:41:46ID:E8nv73TYHTML::Templateの使い方です。
プログラム側で、@tmpには
[email protected]
[email protected]
[email protected]
[email protected]
と4つ入っています。
これを
<p>Addr:<select name="userid">
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
<option value="[email protected]">[email protected]</option>
</select></p>
いう風にしたくて、テンプレート側で以下のようにループを掛けています。
<p>Addr:
:<select name="userid"><TMPL_IF NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_IF>
</select></p>
プログラム側で
$template->param(USERID => @tmp);
で、当然のことながらうまくいかないのですが、HTML::Templateの日本語訳を読んでも
このような使い方の例がありません。
どのようにすればいいのか、教えていただければと思います・・・。
0080nobodyさん
2005/08/19(金) 14:47:40ID:???普通にforeachでまわせば?
008179
2005/08/19(金) 15:00:33ID:???「HTML::Templateを使え」とは言われていないのですが、
H T M L 部 分 は 必 ず 外 部 フ ァ イ ル に し ろ
というお達しがあるので、CGI側で丸ごと<option>〜</option>を吐き出すことができません。
これができれば簡単なのですが・・・。
・デザインはデザイナーがやる
・デザイナーにはCGIの部分は「一切」触らせない
・だからCGIからHTMLを丸ごと吐き出すような作りにはできない
で、HTML::Templateに行き着いたわけでして。
0082nobodyさん
2005/08/19(金) 15:10:03ID:???ループをかけているといっているがどこにもループないし、例がないといっているが
HTML::TemplateのTMPL_LOOPのところの例はそのものズバリだと思うのだが。
なんか違う世界が見えてる人?
008379
2005/08/19(金) 15:13:01ID:???ありがとうございました。
008479
2005/08/19(金) 15:17:04ID:???ごめん。
<p>Addr:
:<select name="userid"><TMPL_LOOP NAME=USERID>
<option value="<TMPL_VAR NAME=ADDR>"><TMPL_VAR NAME=ADDR></option></TMPL_LOOP>
</select></p>
でした。
あんまりできないもんだから、IF使って値がある間にぶち込むことを考えてて
そのまま貼り付けちまった。
LOOPの例は読んでんだけど、ハッシュの例しかなく。
008579
2005/08/19(金) 15:56:39ID:???<TMPL_VAR NAME=ADDR>
だけ書いておいて、CGIの側で
my $tmp2
foreach my $tmp(@addr){
$tmp2 .= "<option value=\"$tmp\">$tmp</option>\n";
}
my $tmp3 = "<p><select>$tmp2</select></p>\n";
$template->param(ADDR => $tmp3);
でできました。ありがとうございました・・・。
0086nobodyさん
2005/08/19(金) 17:15:00ID:???それはHTMLがプログラム側に染み出してるので、テンプレ使う意義を
考えるとイマイチだな。
私ならプログラム側は
$template->param(ADDR => [map {{A => $_}} @addr]);
としといてテンプレの方で
<TMPL_LOOP NAME=ADDR>
<option value="<TMPL_VAR NAME=A>"><TMPL_VAR NAME=A></option>
</TMPL_LOOP>
とします。
0087nobodyさん
2005/08/20(土) 23:50:12ID:???$ret = open (FILE, "hoge.txt");
ファイルオープンに失敗した場合、undefが返ってくるらしいのですが、
オープンに失敗したかどうかの判定をする際に
if ($ret == undef) {
と記述するべきなのか
if ($ret eq undef) {
とするべきなのか悩んでいます。
どちらも正常に判定はされているらしいのですが。
open (FILE, "hoge.txt") || &error("File open failed.");
などと書くのもありなのは知っていますが、
オープンに失敗して&errorを呼ぶ前にいくつかの処理を実行させたいので、
if文での判定を行いたいのです。
008887
2005/08/20(土) 23:52:58ID:???if(!open (FILE, "hoge.txt")) {
処理1;
処理2;
&error("failed.");
}
と記述すれば問題なさそうですね・・・
0089nobodyさん
2005/08/21(日) 00:00:39ID:???open FILE, "hoge.txt"
or do{ 処理1; 処理2; error("failed.") };
とかどう?
0090nobodyさん
2005/08/21(日) 00:29:16ID:???解決してるみたいなので、ちょっとした補足です。
undefは未定義値ではなく、未定義値を返す関数undef()です(無引数の場合)。
未定義値との比較は、==, eq ではなく defined() を使うと良いでしょう。
0092nobodyさん
2005/08/22(月) 18:49:38ID:IX9Ccu2Qforeach $a (@hourlist){ ($mons1,$mons2,$mons3,$mons4,$mons5,$mons6,$mons7,$mons8,$mons9,$mons10,$mons11,$mons12,$mons13,$mons14,$mons15,$mons16) = split(/<>/,$a);
}
# 時間代入
if ( $in{'mons'} == '城内2時間キングアッピー' ) {
$mons1 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内10時間キングアッピー' ) {
$mons2 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内ドラゴン' ) {
$mons3 = $in{'timeh'}
} elsif ( $in{'mons'} == '城内朱雀' ) {
$mons4 = $in{'timeh'}
} elsif ( $in{'mons'} == '2時間カイザー' ) {
$mons5 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カイザー' ) {
$mons6 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カイザー' ) {
$mons7 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間カース' ) {
$mons8 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ブレス' ) {
$mons9 = $in{'timeh'}
} elsif ( $in{'mons'} == '7時間ルーン' ) {
$mons10 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間カース' ) {
$mons11 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ブレス' ) {
$mons12 = $in{'timeh'}
} elsif ( $in{'mons'} == '10時間ルーン' ) {
009392
2005/08/22(月) 18:52:53ID:IX9Ccu2Q} elsif ( $in{'mons'} == '城外キングアッピー' ) {
$mons14 = $in{'timeh'}
} elsif ( $in{'mons'} == '9時間リグレット' ) {
$mons15 = $in{'timeh'}
} else {
$mons16 = $in{'timeh'}
}
$_ = "$mons1<>$mons2<>$mons3<>$mons4<>$mons5<>$mons6<>$mons7<>$mons8<>$mons9<>$mons10<>$mons11<>$mons12<>$mons13<>$mons14<>$mons15<>$mons16<>\n";
push (@newhour,$_);
こうやったのですが、1〜4番目に入れたいデータが1番目に、6・8〜10番目に入れたいデータが6番目に、7・11〜14番目に入れたいデータが7番目に入ってしまいます。
どこが原因か教えていただけないでしょうか?
0096nobodyさん
2005/08/22(月) 22:43:42ID:???my @tempmons = qw/dummy 城内2時間キングアッピー 城内10時間キングアッピー ... /;
my %mons_to_index = map { $tempmons[$_] => $_ } 0..$#tempmons;
foreach(@hourlist){
chomp;
my @mons = split /<>/;
$mons[ ($mons_to_index{ $in{'mons'} } || @mons)-1 ] = $in{'timeh'};
$_ = join '<>', @mons,"\n";
}
ループを1個減らそうとハッシュを使ってみたのですが、
indexが0の時の対処が強引になってしまいました
0097nobodyさん
2005/08/22(月) 23:01:26ID:???全然追ってないけど、とりあえず $in{'mons'} と $in{'timeh'} は
ループの外へ出して別変数に入れようよ。
0098nobodyさん
2005/08/22(月) 23:19:39ID:???$sizeという数値が入る変数があり、これをヒアドキュメントで出力したいのですが、
print <<"EOF";
log file size $sizeKB
EOF
などと書くと、$sizeとKBではなく$sizeKBという変数として認識されてしまうのですが、
ヒアドキュメンド内で変数の直後に半角英数字を続けて書く方法はないでしょうか。
0101nobodyさん
2005/08/23(火) 00:16:13ID:???いいんじゃない?
私は頭の部分をこう書くかな。
my @tempmons = qw{dummy 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
0102nobodyさん
2005/08/23(火) 00:49:00ID:???んじゃ、その %mons_to_indexがもう出来てるとして俺は空間効率でも上げてみるか。
頭の中で考えただけだから、間違ってたらごめん。
my $tm = $in{'timeh'};
my $mons_id = $mons_to_index{$in{'mons'}};
foreach my $hour (@hourlist) {
my $i = 0;
while ($hour =~ m/<>/go) {
next if $i++ != $mons_id;
$hour =~ s/[^<>]+<>\G/$tm<>/o;
last;
}
}
ところで、なんで @hourlist が配列なのか不明。
もとのコード >>92 でも foreach で回してるけど、$mons* が上書きされちゃうし。
0103nobodyさん
2005/08/23(火) 01:26:51ID:???sub data_load {
open DATA, "<data.txt" or die "Can't open : $@";
my @lines = <DATA>;
close DATA;
return [ undef, map{ split '<>' } @lines ];
}
sub data_save {
my @data = join '<>' => map{ $$_ } @_;
local $" = "\n";
open DATA, ">>data.txt" or die "Can't open : $@";
print DATA "@data";
close DATA;
}
とすれば
@::ref_hours = data_load();
$::ref_hours->[ $in{mons} ] = $in{timeh};
data_save( @::ref_hours );
応用方法もいくらでもあるだろう。
0104nobodyさん
2005/08/23(火) 01:32:14ID:???return map{ [ undef, split/<>/,$_ ] } @lines;
だな。
my @tempmons = qw{ 城内2時間キングアッピー 城内10時間キングアッピー ...};
my %mons_to_index;
@mons_to_index{@tempmons} = 0..$#tempmons;
にして
return map{ split/<>/ } @lines;
とかしたいが元スクリプト読む気ないので間違ってるかも。
0105nobodyさん
2005/08/23(火) 01:35:17ID:???X return map{ split/<>/ } @lines;
O return map{ [split/<>/] } @lines;
0106nobodyさん
2005/08/23(火) 02:18:30ID:???0107nobodyさん
2005/08/23(火) 02:21:03ID:???0108nobodyさん
2005/08/23(火) 02:22:58ID:???うは、正規表現を使いますか。
(foreachは遅いとかの突っ込みは無しの方向で)
my $tm = $in{timeh};
my $mons_id = $mons_to_index{$in{mons}} || @tempmons;
foreach my $hour (@hourlist){
foreach(1..$mons_id){
$hour =~ m/<>/g;
}
$hour =~ s/\G[^<>]+/$tm/;
}
0109nobodyさん
2005/08/23(火) 09:47:32ID:???>>102 です。
どうも元のコード読む限り、置換は一ヶ所だけなんだよね。elsif で繋いであるし。
正規表現の作製コストと、splitかけてjoinするコスト
どっちが良いかは、この場合かなり微妙…。もしかしたらsplit, joinのが安いかも。
0110nobodyさん
2005/08/23(火) 12:04:31ID:???最近見かけた名言を贈ろう。
「推測するな。計測しろ」
http://search.cpan.org/~nwclark/perl-5.8.7/lib/Benchmark.pm
0111nobodyさん
2005/08/23(火) 12:40:05ID:???0112nobodyさん
2005/08/23(火) 13:46:44ID:???my @moge = (1, 2, 3, 4);
my @foo = (\@hoge, \@moge);
@fooを使って、$hoge[2]の値を取得するにはどうすればよいですか?
\@hogeは必ず$foo[0]にあります。
0113nobodyさん
2005/08/23(火) 13:57:40ID:???http://perldoc.jp/docs/perl/5.6.1/perllol.pod
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
0114108
2005/08/23(火) 14:42:04ID:???一回だったら微妙かもですね。
>>110
ベンチなら正規表現の方が2倍速かった。(@hourlist=10で計測)
ただ、ベンチは繰り返し実行するから、
正規表現のコンパイルコストなど測れない部分がある。
大抵は無視できるけど、一回こっきりの話だと無視できない可能性も。
細かい話だけどね。
0115102
2005/08/23(火) 17:55:10ID:???ありがとう。その通りです。
ベンチ鬼のようにやってたから、目測でコスト見積るようになった。
「スカラ変数宣言で◯バイト消費。数値入力でヘッダ部分にビットが立つ。ボディーが追加されて数値設定。文字列として使っちゃったから、ヘッダ部のビット変更。ボディーの数値構造体切り離して、両用の構造体に変更。」
とか、気にしてた頃はスクリプト見ながらここまで考えてた(あほです)。
>>114
わざわざベンチありがとう。やっぱり1回だと微妙ですよね…。m/<>/go がリニアサーチだし。
0116nobodyさん
2005/08/23(火) 21:09:27ID:???そこら中のサイトで「セキュリティーホールだ!クリップボードの内容が盗見られる!」
と騒ぎ立ててんだけど、もちろんsubmit送信を使えば値を渡すことができるだろうけど、
1回の閲覧のみでJavaScriptで取った値をCGIに渡すことは不可能だよね?
0117nobodyさん
2005/08/23(火) 21:14:43ID:???太郎,男,20才
花子,女,21才
健太,男,22才
・
・
というデータがname.datというファイルでcgiと同じディレクトリにあり、
パラメータとして'健太'を与えてやると、'22才'と返ってくるようなスクリプトは、どう書けばいいのでしょうか。
よろしくお願いします。
0118nobodyさん
2005/08/23(火) 21:22:48ID:???while (<IN>) {
chomp;
my @tmp = split /,/;
$name2age{$tmp[0]} = $tmp[2];
}
close IN;
print $name2age{'健太'};
ハッシュのキーに漢字ってキモいな
0119nobodyさん
2005/08/23(火) 21:28:56ID:???みたいなハッシュを別に作って解決
(゚∀。)アリャ?
0123nobodyさん
2005/08/24(水) 01:11:31ID:???0124nobodyさん
2005/08/24(水) 01:11:32ID:???いずれにせよバレバレっぽいなぁ
0126nobodyさん
2005/08/24(水) 01:16:54ID:???0127nobodyさん
2005/08/24(水) 04:39:31ID:???板違い。
http://pc8.2ch.net/test/read.cgi/sec/1005185421/
0128nobodyさん
2005/08/24(水) 05:33:37ID:???PCからは書き込みができるのですが携帯(�@モード)からは書き込みはおろか管理画面へすら入れません。
CGI本体のソースはこちらになります。
http://namihei.zone.ne.jp/upup/up/44694.txt
他にはlogファイルとjcode.plを使います。
enctype="multipart/form-data"あたりに問題があるように思うのですが行き詰まってしまいました。
どこをどのようにすれば携帯から書き込めるようになるでしょうか?
0129128
2005/08/24(水) 05:37:30ID:???ttp://namihei.zone.ne.jp/upup/up/44694.txt
0130nobodyさん
2005/08/24(水) 06:19:55ID:???原因わかってるならenctype="multipart/form-data"を消せばいいやん
それはファイル添付するときのenctypeだし
どうしてもenctype書きたいならenctype="x-www-form-urlencoded"で
0133nobodyさん
2005/08/24(水) 08:47:43ID:???0134nobodyさん
2005/08/24(水) 09:45:36ID:???ファイルを開いて読んで配列に入れてから書き込むを永遠と繰り返すしかないんでしょうか。
0136nobodyさん
2005/08/24(水) 11:04:23ID:ephPxiIZ0137nobodyさん
2005/08/24(水) 11:15:53ID:???他の方法お願いします。
0138nobodyさん
2005/08/24(水) 11:24:30ID:???ファイルを開いて書き込むのを繰り返すのが普通。ただし
配列に入れるのは無駄なので読んだらどんどん書き出せ。
.
0141nobodyさん
2005/08/24(水) 15:15:16ID:???パラメータ$goodsnumに入れた商品番号$tmp[0]に対する得票数$tmp[1]を
カウントアップさせたいのですが、ログファイルがうまく更新されません。
コードは以下の通りです。
open(LOG, "+<$file");
flock(LOG,2);
print "Content-type: text/html\n\n";
while ($line = <LOG>) {
@tmp = split /,/,"$line";
if ("$tmp[0]" eq "$goodsnum"){
seek(IN,0,0);
$tmp[1] ++;
print LOG "$tmp[0],$tmp[1]\n";
truncate(IN,tell());
print "商品番号$tmp[0]の得票数は$tmp[1]";
}
}
flock(LOG,8);
close(LOG);
期待する結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,1
実際の結果(ログファイルの内容)
実行前 syohin555,0 → 実行後 syohin555,0[改行]syohin555.1
ログファイルには他にも商品の投票データがあり、パラメータで渡した商品のみ、カウントアップさせる企てです。
ごちゃごちゃして申し訳ありません。どうぞよろしくお願いします。
0144nobodyさん
2005/08/24(水) 15:56:30ID:???一行の長さが不定なテキストデータを、読み出しながら書き出すのは無茶。
得票数が 9 => 10 になったらまずいよね。
全部読み込んでから全部書き出すのが無難じゃないかな。
■ このスレッドは過去ログ倉庫に格納されています