[error] [client ---- ] Argument isn't numeric in addition (+) at ... 0001.cgi line 85.

このQ&Aのポイント
  • 初心者が質問した内容は、Apacheのerror.logにエラーメッセージが表示される問題です。
  • 問題の原因は、行85で数字ではないものを足し算していることです。
  • 問題を解決する方法として、数値でない要素を取り除く等の対処が考えられます。
回答を見る
  • ベストアンサー

[error] [client ---- ] Argument

初心者で http://oshiete1.goo.ne.jp/qa5056638.html で質問した者です。もうひとつ、お願いします。 Apache の error.log に [error] [client ---- ] Argument "..." isn't numeric in addition (+) at ... 0001.cgi line 85., と表示されるのを、防ぐ方法をお教えください。 ↓このようにしています。 open(FILE, '<+score.txt') or die "$!"; my @data = <FILE>; close(FILE); my $data2 = $data[0] +1;#------------- line85 open(FILE, '>+score.txt') or die "$!"; print FILE $data2; print FILE (",問題番号,$num,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE @data; close(FILE); print "<font size=+1>今日 "; print "<font color=magenta>$data2</font color>";print "回 正解解答をしました --- </font size> "; 1時間に、0001.cgiと同じように書かれれたファイル約100個に、約40人がアクセスします。Apache の error.log が、すぐ大きくなってしまいます。どうか、よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

$data[0] は "222,問題番号,999,2009年6月22日 22時40分13秒\n" のような文字列ですよね。これに +1 するのは、perl だからできるものの 少し乱暴ではありませんか。最初の数字の部分を取り出して、+1 しましょ う。 例えば、 my ($data2) = split /,/, $data[0], 2; $data2++; のように。

ttaa100kkaa
質問者

お礼

まことにありがとうございました。やてみます。すみませんでした。

関連するQ&A

  • Argument "\\n" isn't numeric in numeric comparison (<=>)

    初心者です。よろしくお願いします。 WindowsXP,ProffesionalでApache,LANの中だけでやっています。 以下の(1)、(2)が Apache の error.log に 非常にたくさん出てきて困っています。 (1) Argument "-" isn't numeric in numeric comparison (<=>) at C:/ApacheGroup/--- line 235., referer: http://--- (2) Argument "\\n" isn't numeric in numeric comparison (<=>) at C:/ApacheGroup/--- line 235., referer: http://--- このファイルは、だいたい以下のようになっています。 #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); # 45個のファイルから一行目を取り出します。 open(FILE, "../4k/4k01/+score.txt") or die "$!"; my $line1 = <FILE>; close(FILE); #------------------------------------------ open(FILE, "../4k/4k02/+score.txt") or die "$!"; my $line2 = <FILE>; close(FILE); #------------------------------------------ # これを繰り返します。 #------------------------------------------ open(FILE, "../4k/4k45/+score.txt") or die "$!"; my $line45 = <FILE>; close(FILE); #------------------------------------------ # 取り出した行の例は # 82,問題番号,1548,2009年07月15日 14時11分20秒 ( = $line1) # です。 # この行は、別の cgi ファイルで、以下のように書き込んだものです。 --------------------------------------------- # open(FILE, '<+score.txt') or die "$!"; # my @data = <FILE>;my ($e, $f , $g, $h) = split(/,/, $data[0]); # close(FILE); # my $data2 = $e +1; # open(FILE, '>+score.txt') or die "$!"; # print FILE $data2; # print FILE (",問題番号,$num,$year年$mon月$day日 $hour時$min分$sec秒\n"); ------------------------------------------- # これを @array に 入れます。 my @array = ("$line1,4k01","$line2,4k02", ---繰り返し--,"$line45,4k45"); # ソートして、表示します。 @array = sort { (split(/\,/,$b))[0] <=> (split(/\,/,$a))[0]} @array; #-- line 235 for my $val (@array){ #-- line 236 print $val . "<br>"; #-- line 237 } すると、--- 104,問題番号,1541,2009年07月15日 14時26分46秒 ,4k06 102,問題番号,1541,2009年07月15日 14時29分43秒 ,4k18 94,問題番号,1541,2009年07月15日 14時20分07秒 ,4k20 82,問題番号,1541,2009年07月15日 14時30分14秒 ,4k25 以下省略 --- と 表示されます。 error.log に表示されないようにするには、どうしたら、いいでしょうか? お教えください。

    • ベストアンサー
    • Perl
  • ランダムに1行読込み フォーム文字との同異を 判定するには?

    txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • 指定の行数目から行を抽出する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを使っています. Perlでしたいことは,「指定の行数目から行を抽出する」ことです. 具体的には以下のようにしたいと思っております. data.txt A B C D E F line.txt 2 4 6 output.txt B D F 先ほどある方からサンプルソースを教えてもらったのでそれをベースに作ってみましたが,出力のoutput.txtが空のままです. use strict; use warnings; use feature ':5.10'; use IO::File; open my $file2, '<', 'line.txt' or die "can't open input $!"; chomp(my @subjects = <$file2>); close $file2; open my $newfile, '>>', 'data_out.txt' or die "can't open output $!"; open my $file, '<', 'data.txt' or die "can't open input $!"; while (my $line = <$file>) { chomp $line; foreach my $line (@line) { print $line; if ($. eq $subjects){ say {$newfile} $line; } } } close $file; close $newfile; どこが間違っているのでしょうか.ご指摘ください.よろしくお願いします.

    • ベストアンサー
    • Perl
  • 一つのテキストファイルと複数のファイルの結合

    よろしくお願いします.ディレクトリ内の一つのテキストファイル(joint.txt)と複数のファイルの結合を行ごとに隣へ結合するプログラムを作成しています.ここで以下のプログラムを作成したのですが,うまくいかないため,誤っている部分をご指摘願えないでしょうか. my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; open(FILE2,"joint.txt"); my @file = <FILE>; my @file2 = <FILE2>; close(FILE); close(FILE2); foreach my $line (@file) { foreach my $line2 (@file2) { chomp $line2; $line = "$line2.",".$line"; } } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; print NEWFILE @file2; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • Perlのtruncateについて

    + test.txt 0 1 2 3 + main.cgi open(FH, "+<test.txt"); my @Log = <FH>; truncate(FH, 0); seek($FileHandle, 0, 0); print(FH "4"); close(FH); これで、main.cgiを実行すると、test.txtの中身は 4 1 2 3 となってしまいます。truncateがきいてないようなのですが、なぜでしょうか。 truncate(FH, 0) or die "error"; とすると、errorと表示されてしまいます。 なぜこうなるのでしょうか。 致命的エラーがでるわけでもないので、環境が悪いわけではないような気がするのですが。 flockをしたいのですが、他にファイルの中身を空にする方法とかありませんか。

    • ベストアンサー
    • Perl
  • SESULinux で CGI をするには?

    http://oshiete1.goo.ne.jp/qa3578211.html で質問していた、初心者です。再び、お願いいたします。 LAN の 中だけで Web サーバ を実行しています。 SUSELinux 10.1 OSS の ・・・/htdocs/cgi-bin というディレクトリで *.cgi が動くようになりました。 ところが、このディレクトリに、置いた *.html ファイルを別のコンピュータから見ようとすると、Internal Server Error となってしまいます。 Apache の error_log では、 (8)Exec format error: exec of '/srv/・・・/*.html' failed そして、 Premature end of script headers: *.html となっています。 この *.html を htdocs というデレクトリに置くと、OK なのですが...。 また、*.cgi ファイルに open(FILE, '>>aaa.txt') or die "$!"; print FILE ("200,$year年$mon月$day日 $hour時$min分\n"); close(FILE) と書くと、WindowsXP, Apache, ActivPerl では、 自動的に、aaa.txt というファイルができて、 そのファイルに 「200,日付時間」 が 書き込まれたのですが、 SUSELinux 10.1 OSS の ・・・/htdocs/cgi-bin では、 だめでした。これが、できると、大助かりです。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • テキストを参照としたPerlによる名前の変更

    よろしくお願いします。ディレクトリ内のファイル名をテキストデータを参照として変更したいと思っております。まず、以下の参照テキストがあります。 sansyo.txt 1,2,1 2,3,1 3,4,2 4,5,3 6,7,9 ・ ・ ・ ・ このファイルを利用してディレクトリ内のファイルを以下のようにリネームします。 1,2.txt → 1,2,1.txt 2,3.txt → 2,3,1.txt 3,4.txt → 3,4,2.txt 4,5.txt → 4,5,3.txt 6,7.txt → 6,7,9.txt ・ ・ ・ ・ ・ ここで私は以下のプログラムを作成しました。 sansyo.pl ------------------------------ use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; open(FILE2,"sansyo.txt"); my @file = <FILE>; my @file2 = <FILE2>; close(FILE); close(FILE2); foreach my $line2 (@file2) { my ($a,$b,$c) = split(/,/, $line2); if ($dir == $a.",".$b.".txt"){ rename ($dir, $a.",".$b.",".$c.".txt"); } } } closedir(DIR); 内容は、FILE2にsansyo.txtをforeachで1行ずつ読み込んでいき、 $a,$b.txtというファイルが$dirに読み込んだファイルにあったら、 $a,$b,$c.txtというファイルにリネームするという内容です。 ですが、いろいろ試行錯誤したもののうまくいきません。 具体的には、 Argument "1,2.txt" isn't numeric in numeric eq (==) at sansyo.pl line 23. とエラーがでて if ($dir == $a.",".$b.".txt"){ この部分でエラーが発生しているようです。 どなたか解決方法をよろしくお願いします。

    • ベストアンサー
    • Perl
  • エラーになってしまいます。

    先日、ファイルの一行だけを読込める?と質問した者です。早速教えて頂いた方法でやってみました。 open(IN,"A.txt"); while ($xx = <IN>) {   if ($. == 5) {     print $xx;   } } close(IN); とやりました。 サーバーエラーになるのでまず open(IN, "A.txt"); while ($xx = <IN>) { print $xx; } close(IN); とファイルの読み込みでやってみたのですがそれでもサーバーエラーになってしまいました。 エラーの原因がどこにあるのか、わからなく困っています。考えられるような原因は何でしょうか? ちなみにcgiのパーミッションは755です。 あとtxtファイルをどこに置けばいいのか、よくわからないいのですがそれが原因なのでしょうか?

    • ベストアンサー
    • CGI
  • redoを実行するとスカラー変数の値がundefになってしまうのはどうしてでしょうか?

    はじめまして。 質問があります。 まずは以下のコードを見てください。 ---------------------------------------------------------------- use strict; use warnings; open(FILE,'redo01.txt') or die "$!"; while(my $line = <FILE>) { print "undef\n" unless( defined($line) ); chomp($line); if($line =~ /---$/) { $line .= <FILE>; redo; } print $line,"\n"; } close(FILE); ---------------------------------------------------------------- --redo01.txt---------------------------------------------------- zero--- one--- two--- three--- four ---------------------------------------------------------------- ファイルから一行を読み込んできてスカラー変数$lineに代入して、 redoを実行しながら$lineの値をどんどん連結していき最後に文字列を 表示させようと思っていたのですが、なぜかredoを実行後 ループ内の先頭行に制御を移してから$lineの値を調べてみると、 undefになってしまいます。事実、chomp()関数やパターンマッチ、 print関数を実行すると、エラーになってしまいます。なぜ$lineの値 がundefになってしまうのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • Perl
  • PerlでFILEを埋め込もうとするとエラー

    Perlでアクセスカウンターを作ろうと思っています。 そこでファイルオープンを勉強し、 CGIプログラムを実行しようとしたところ、 エラーが起こりました。↓ Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, ********@*********(伏せてあります) and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. ------------------------------------------ Apache/2.0.55 (Win32) Server at 127.0.0.1 Port 80 ソースを見てもおかしい所は見当たりません…↓ #! c:/perl/bin/perl open(FILE, "./sample.txt"); @data = <FILE>; close (FILE); print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>sample</title> </head> <body> <p>$data[0]</p> <p>$data[1]</p> <p>$data[2]</p> </body> </html> END サーバーはApacheを使っています。 原因がわかったら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう