ログファイルにデータを追加する際のスペースの問題

このQ&Aのポイント
  • ログファイルにデータを追加する際、一部の行に不要なスペースが挿入される問題が発生しています。
  • スクリプトを調査した結果、print文の実行時にスペースが挿入されてしまうことが原因と判明しました。
  • 解決策として、print文の前後にあるスペースを削除する処理を追加することで、スペースの挿入を防ぐことができます。
回答を見る
  • ベストアンサー

行頭に変なスペースが…

入力したデータをログファイルの一番上に入れたいために以下のようにしました。 open(FH2,"***.log"); flock(FH2,2); @files = <FH2>; flock(FH2,8); close FH2; open(FH,">***.log"); @filew = "user=$FORM{'name'}<>TIME=$FORM{'TIME'}\n@files"; print FH @filew; close(FH); こうするとなぜかログファイルの2行目以降の頭にスペースが1文字分入ります。 2個目のログファイルオープンの3行目 print FH @filew; のスペースが原因かと思い、 print FH@filew; としてみましたが、やっぱりスペースが入りました。 このスペースを入らないようにするにはどうしたらいいでしょうか?

  • w-inty
  • お礼率72% (1169/1618)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

@filew = "user=$FORM{'name'}<>TIME=$FORM{'TIME'}\n@files"; ↑のように""の中で配列値(この場合は@files)を展開すると,要素と要素の間に$"という変数の値が挿入されます。 そして$"の値のデフォルト値は " "です。へんなスペースの原因はこれです。 で... 対策その1 $" = ""; という行を@filew = ~の処理の前に追加する。 あるいは.. 対策その2 @filew = ("user=$FORM{'name'}<>TIME=$FORM{'TIME'}\n", @files); に書き換える

w-inty
質問者

お礼

回答ありがとうございます。 自分が知らないところでそんなことが起こっていたんですね(^^; 教えていただいた対策1で無事回避することができました。 ありがとうございました★

関連するQ&A

  • ログファイルを削除するcgiプログラム

    ログファイルを削除するcgiプログラム -------------------- $GYOUSUU = $FORM{'GYOUSUU'}; #--- ログファイルオープン open(FH,"***.log"); flock(FH,2); @FILES = <FH>; flock(FH,8); close FH; undef $FILES[$GYOUSUU]; open (FH2,">***.log"); @filew = "@FILES\n"; print FH2@filew; close(FH2); -------------------- となっているのですが、修正後にログファイルの行の頭に、半角スペースが入ってしまいます。 どこを修正すればいいのでしょうか?

    • ベストアンサー
    • Perl
  • cgiログファイルの書き込みに余計なスペースが入る。

    ---------- #ここでログファイルに書き込みを行う。 open(FH,">>log.log"); print FH"ID=$ID&COUNT=$COUNT\n"; close(FH); #ログファイルをさらに開く。 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; ログファイルを並び替えてその順番で書き込み。 $gyou = @log; @sort=sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; print "<FONT COLOR=RED>@sort</FONT><BR>\n"; open(FILE2, ">log.log"); print FILE2"@sort"; close (FILE2); ---------- というように行っていますが、一番最初のID=01&とかの前に半角スペースが入ります。 下の行に行くほどスペースが増えます。 どこが原因でしょうか?

    • ベストアンサー
    • Perl
  • ファイルのデータの半角スペースが削除できない

    プログラム(1)--------------------------------------------------- @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; open(TIME,">ファイル名"); print TIME "${year}\n"; print TIME "${mon}\n"; ---省略--- close(TIME); プログラム(2)--------------------------------------------------- open(TIME,"ファイル名"); flock(TIME,1); @time=<TIME>; close(TIME); ------------------------------------------------------------- 以上のようなプログラムを使い時間を取得したのですが。 printしてみると、「2007 8 24」のように半角スペースが入ってしまいます。chomp();も試してみたのですが、どうにも削除できません。 どうやれば、半角スペースを削除出来るのでしょうか?もしくは、どうやれば半角スペースが入らないように保存、展開できるのでしょうか? 分かり難い質問かとは思いますが、ご返事お願い申し上げます。

    • ベストアンサー
    • Perl
  • TSVデータを上書きしたい

    はじめまして。 CGI初心者です。 データの上書きがしたいのですがなかなかうまくいかなくてこまっています。 以下のソースは追加書き込み処理には成功しています。 以下に何を施せば上書きがうまくいくのかアドバイスをお願いします。 $scheduleFile2 = qq($form{"mon"}.tsv); # 読み込み処理 open(LOG,"$scheduleDir/$scheduleFile2"); @logs = <LOG>; close(LOG); foreach $logs(@logs){ ($golfdate,$areada,$ken,$date2,$para)=split(/\t/,$logs); } # 読み込み処理 # 書き込み処理 unless(&serchFile($scheduleDir,$scheduleFile2)){ &makeFile("$scheduleDir/$scheduleFile2"); } @DATA = (); open(FH,"+<$scheduleDir/$scheduleFile2"); flock(FH,LOCK_EX); while(<FH>){ $_ =~ s/\r//g; $_ =~ s/\n//g; # 行の末を削除する chomp; push(@DATA,$_); } $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; $data = qq($data01\t$data2\t$data3\t$data4\t$data5); print FH "$data"; flock(FH,8); close(FH);

    • 締切済み
    • CGI
  • cgiログデータ入力

    下記のようなものを作成しました。 if ($FORM{'WORD'} eq 'フォーム'){ &form; } elsif($FORM{'WORD'} eq '確認'){ &kakunin; } elsif($FORM{'WORD'} eq '入力'){ &nyuuryoku; } sub kakunin{ print "<FORM METHOD=POST ACTION=top_nyuuryoku1.cgi>\n"; print "<TABLE CLASS=TABLE2 CELLSPACING=0 CELLPADDING=2>\n"; print "<TR><TD WIDTH=80 CLASS=TD1>社員番号</TD><TD CLASS=TD2>$FORM{'BANGOU'}<INPUT TYPE=HIDDEN NAME=BANGOU VALUE=$FORM{'BANGOU'}></TD></TR>\n"; print "<TR><TD WIDTH=80 VALIGN=TOP CLASS=TD1>本文</TD><TD CLASS=TD2>$FORM{'NAKAMI'}</TD><INPUT TYPE=HIDDEN NAME=NAKAMI VALUE=$FORM{'NAKAMI'}></TR>\n"; print "</TABLE>\n"; print "<BR>と入力されました。これでよければボタンを押してください。<BR><BR>\n"; print "<INPUT TYPE=HIDDEN NAME=WORD VALUE=入力>\n"; print "  <INPUT TYPE=SUBMIT CLASS=BUTTON VALUE=入力>\n"; print "</FORM>\n"; } sub nyuuryoku{ print "入力しました。<BR>\n"; print "<A HREF='top.cgi'>戻る</A>\n"; open (FILE,">>top.log"); flock(FILE,2); @FILES = "$buffer\n"; print FILE @FILES; flock(FILE,8); close(FILE); } ※多少省略あり。 ※$bufferはこれの前のページから受け取ったもの。 kakuninのところの$FORM{'NAKAMI'}ではちゃんと半角スペースや改行が認識されていますが、nyuuryokuになるとだめです。 一体何が原因なのでしょうか?

    • ベストアンサー
    • CGI
  • ローカルだと改行されるのに、サーバーにアップすると半角・が…

    ローカルでテストすると、きちんとログファイルに改行と認識され、 NAME=***&……TIME=20040515 NAME=***&……TIME=20040516 のように書き込まれますが、サーバーにアップすると、 NAME=***&……TIME=20040515・NAME=***&……TIME=20040516・ のようになってしまいます。 書き込みは以下のようにしています。 open (FILE2,">>log.log"); @fw = "NAME=$FORM{'NAME'}&…&TIME=$year/$mon/$day $hour:$min:$sec&TIME2=$year$mon$day$hour$min$sec\n"; print FILE2 @fw; close(FILE2); なぜでしょうか? 解決策お願いします(><)

    • ベストアンサー
    • Perl
  • 新しいログの書き込み

    新しいログを追加で上に書き込む方法はどのようにしたらよいのかアイディアがありません。 ご教授願います。 if($mode eq "html"){ flock(FH, LOCK_EX); open(FH,"${datafile}"); @html = <FH>; close(FH); flock(FH, LOCK_NB); $html = join('',@html); @html = split(/$chtml/ , $html); $html[1] = $data; $html = join($chtml,@html); flock(FH, LOCK_EX); open(FH,">$datafile"); print FH $html; close(FH); flock(FH, LOCK_NB);

  • Webプログラミング.ファイルへの保存について

    Webプログラミング初心者です. ファイルへの保存について質問です>< フォームから受け取ったデータを文字コード変更させてファイルに保存する場合 $name1=$cgi->param('name'); $name2=$cgi->param('number); このように一度変数にいれ. 次に文字コードの変換をし変換した内容を再び$name1,$name2に格納した場合, ファイルの書き出し•保存のソースコードは, if (open(FH, "form.txt")) { @file = <FH>; close(FH); unshift(@file, "$in{'name1'}\t$in{'name2'}\n"); //ココの部分です. if (open(FH, ">form.txt")) { print FH @file; close(FH); } else { print "<p>ファイルに書き込めません。</p>"; } } else { print "<p>ファイルを読み込めません。</p>"; } このような感じで良いのでしょうか? unshift(@file, "$in{'name1'}\t$in{'name2'}\n"); の変数名の部分では例題はフォームから受け取ったものを そのまま書いてある例が多くどのように記述したら良いかわかりません. 一度やってみてできなかったので他の部分にミスがあったのかと探し中ではありますが... 教えてください.お願いします><

    • ベストアンサー
    • Perl
  • 任意文字の消去

    Rubyで一行チャットを作っておるのですが、 どうしてもリロードする毎にnilが画面に出てしまいます。 どうすれば、消えるのか教えてもらいませんか? cgiのコード #!/usr/local/bin/ruby print "Content-type: text/html\n\n" #html入力フォーム print <<EOF; <html> <body> <h4>チャットだお(´・ω・`)</h4> <form method="POST"> nameフォーム<input type="text" name="senddata2" size="20"><br> 本文フォーム<input type="text" name="senddata" size="80"> <input type="submit" value="送信"> </form> EOF #data.logを表示 log = "" FILENAME = "data.log" fh = open(FILENAME) fh.each{|l| log += l } fh.close print <<EOF; #{log} EOF #data.logに書き込み&リロード require "cgi-lib" input = CGI.new senddata2 = input["senddata2"] senddata = input["senddata"] fh = open(FILENAME, "a") fh.print senddata2 fh.print "> "+senddata+"<br>" fh.close print <<EOF; <meta http-equiv="refresh" content="0"> </body> </html> EOF 動かしているURL http://shu.hippy.jp/test.cgi

    • ベストアンサー
    • Ruby
  • データの上書き、追加

    はじめまして。 perl初心者です。 TSVデータがあり、 TSVデータの一列目と入力された値が等しい場合は上書き、入力されたデータが一列目に存在しない場合は追加書き込みを行うプログラムを書いています。 以下のように書いてみたのですが、エラーはなく動きません。 アドバイスお願いします。 $scheduleFile2 = qq($form{"mon"}.tsv); unless(&serchFile($scheduleDir,$scheduleFile2)){ &makeFile("$scheduleDir/$scheduleFile2"); } @logs = (); open(FH,"+<$scheduleDir/$scheduleFile2"); # 読み込み処理 @logs = <FH>; close(FH); $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; foreach $line (@logs){ ($corddate,$erea1,$ken,$hiduke,$corse1) = split(/\t/,$line); $data01 = $form{"code"}.$form{"date"}; if($corddate eq $data01){ # データの上書き $logs = qq($corddate\t$data2\t$data3\t$data4\t$data5); open(FH,">$scheduleDir/$scheduleFile2"); print FH @logs; flock(FH,8); close(FH); } else{ # 一番最後の行に追加 $data01 = $form{"code"}.$form{"date"}; $data2 = $form{"area"}; $data3 = $form{"prefecture"}; $data4 = $form{"date"}; $data5 = $form{"open_state"}."\n"; #$logs = qq($data01\t$data2\t$data3\t$data4\t$data5); open(FH,">>$scheduleDir/$scheduleFile2"); print FH $logs; flock(FH,8); close(FH); } }