• ベストアンサー

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
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.2

perl -Mstrict -Mwarnings -e 'print "foo" <=> "bar"' Argument "bar" isn't numeric in numeric comparison (<=>) at -e line 1. Argument "foo" isn't numeric in numeric comparison (<=>) at -e line 1. たぶん"-"と"\\n"(これ改行文字をシングルクォートで囲んでませんか・・・?)を比較してるんだと思いま す。 元のファイルが間違ってる可能性が高いです。

ttaa100kkaa
質問者

お礼

ご回答、まことにありがとうございました。 open(FILE, "../4k/4k01/+score.txt") or die "$!"; my $line1 = <FILE>; close(FILE); を open(FILE, "../4c/4k01/+score.txt") or die "$!"; my $line1a = <FILE>; my $line1 = "$line1a - 4k01"; close(FILE); と直しました。そして my @array = ("$line1,4k01","$line2,4k02", ---繰り返し--,"$line45,4k45"); を my @array = ($line1,$line2, ---繰り返し--- ,$line44,$line45); としました。 そして、元のファイルが空のとき、 0, を書き込みました。 そうしたら、うまくいきました。 ありがとうございました。

その他の回答 (2)

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

「元のデータに問題がないかどうかわからない」というなら, まずそれを確かめてください. データ自体が間違っていたら話にもなりませんよ.

ttaa100kkaa
質問者

お礼

ありがとうございます。よく考えて見ます。すみませんでした。

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

とりあえず確認したいんですが, 元のデータは問題ないですか? あと, ソートせずに出力したら問題ないんでしょうか?

ttaa100kkaa
質問者

お礼

ありがとうございます。ソートせずに for (my $i = 0; $i < 46; $i++){ print $array[$i]; print "<br>"; } としたら、そして、 no warnings qw(uninitialized); としたら、Apache の error.log には何も表示されません。 問題ない、と思われます。 元のデータは問題ないのか、どうか、は、私にはわかりません。元のデータはテキストファイルから読み込んだ1行です。 すみません。

関連するQ&A

  • [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
  • 一つのテキストファイルと複数のファイルの結合

    よろしくお願いします.ディレクトリ内の一つのテキストファイル(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
  • 指定の行数目から行を抽出する

    いつもお世話になっております. 環境は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
  • テキストを参照とした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
  • プログラムの高速化

    いつもお世話になっております.以下のプログラムをできるだけ高速化したいと思います. use warnings; use strict; 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: $!"; while (my $line = <FILE>) { my ($a,$b,$c,$d,$e,$f) = split( /,/ , $line ); my $name = $a.",".$b; open(NEWFILE, ">> ./out/$name.txt") or die "$dir: $!"; print NEWFILE $line; close(NEWFILE); } } close(FILE); closedir(DIR); やっていることは,ディレクトリ内のテキストファイルを読み込んでいって,splitでカンマ区切りにした,$a,$bをファイル名として下のディレクトリのoutに保存していくというものです. ファイル数が数千あり,各ファイルも数千行となるため,このソースを高速化する方法はありますでしょうか.ご回答よろしくお願いします.

    • ベストアンサー
    • Perl
  • 下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する

    いつもお世話になっております.環境はWindows XPのActiveperlです. やりたいことは「下のディレクトリ(3つ)に含まれる同じファイル名のテキストを結合し,カレントディレクトリに出力する」ことです.具体的にはいかのようにしたいと思っています. 現在のディレクトリ/a/1.txt a b c 現在のディレクトリ/b/1.txt d e f 現在のディレクトリ/c/1.txt g h i 現在のディレクトリ/1.txt a b c d e f g h i ここで私は以下のプログラムを作成しました. use strict; use warnings; my $dirname1 = './a/'; my $dirname2 = './b/'; my $dirname3 = './c/'; opendir(DIR1, $dirname1) or die "$dirname1: $!"; while (my $dir1 = readdir(DIR1)) { next unless (-f $dir1); next unless ($dir1 =~ /\.txt$/); opendir(DIR2, $dirname2) or die "$dirname2: $!"; while (my $dir2 = readdir(DIR2)) { next unless (-f $dir2); next unless ($dir2 =~ /\.txt$/); opendir(DIR3, $dirname3) or die "$dirname3: $!"; while (my $dir3 = readdir(DIR3)) { next unless (-f $dir3); next unless ($dir3 =~ /\.txt$/); if (($dir1 == $dir2) && ($dir2 == $dir3)){ open(FILE1, $dir1) or die "$dir1: $!"; my $line1 = <FILE1>; close(FILE1); open(FILE2, $dir2) or die "$dir2: $!"; my $line2 = <FILE2>; close(FILE2); open(FILE3, $dir3) or die "$dir3: $!"; my $line3 = <FILE3>; close(FILE3); my $joint_line = $line1.$line2.$line3; open(NEWFILE, "> $dir1") or die "$dir1: $!"; print NEWFILE $joint_line; close(NEWFILE); } } } } closedir(DIR1); closedir(DIR2); closedir(DIR3); ですが,以下のようなエラーが発生しています. closedir() attempted on invalid dirhandle DIR2 at joint.pl line 51. closedir() attempted on invalid dirhandle DIR3 at joint.pl line 52. ディレクトリハンドルが使われているけれど閉じているか実際にはディレクトリハンドルでは無い時にこれらの警告が発行されるとこの警告がでるようですが,どのようにしたら解決できるのでしょうか.よろしくお願いします.

  • perlのopen()で+<を使用した時の挙動が変

    open()で+<を使用すると読み書き両方ができると 理解しましたが、書き込んだ後の結果が 私が思っていた挙動と違っていました。 例えば、 ---test.pl-------------------------- open(FILE,'+<test.txt') or die "$!"; my $line=<FILE>; print FILE "ABC\n"; close(FILE); ---test.txt---- 123 456 789 --------------- を実行すると ---test.txt---- 123 ABC 789 --------------- となることを期待していましたが実際には ---test.txt---- 123 456 789 123 ABC ---------------- となっていました。 1行だけ読み出したときのファイルポインタ は2行目の先頭を指しているように思われますが なぜこのような結果になるのでしょうか。 (Windows7,ActivePerl)

    • ベストアンサー
    • Perl
  • ディレクトリ内のテキストファイルに対する同一処理

    よろしくお願いします。現在Linuxの環境でテキスト処理をしております。 ディレクトリ内にファイル名の異なった以下のような大量ファイルがあります。 a.txt 0,1,2,3,4,5,6,7 1,2,3,4,5,6,7,8 b.txt 2,3,4,5,6,7,8,9 3,4,5,6,7,8,9,10 これらのファイルをカンマでsplitし、左から2番目の数にだけ1を引き,下のディレクトリであるoutに出力させます。出力は以下のようになります。 ./out/a.txt 0,0,2,3,4,5,6,7 1,2,3,4,5,6,7,8 ./out/b.txt 2,2,4,5,6,7,8,9 3,4,5,6,7,8,9,10 そこで以下のようなPerlのプログラムを作成しました。 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: $!"; my @file = <FILE>; foreach $line (@file) { my ($a,$b,$c,$d,$e,$f,$g,$h) = split(/,/, $line);      my $b = $b - 1; close(FILE); } open(NEWFILE, "> ./out/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR); ですが、出力は完了するのですが、元のファイルから計算がされていません。どこがどう間違えているのかご指摘よろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • perl 5.8.8 日本語マッチ

    perl5.8.8を使っています。 日本語にマッチする正規表現を書きたいのですが、どうしてもマッチしません。 例えば、以下のファイルtest.txtから「さしすせそ」だけを抽出し、表示させたいです。 ---------test.txt-------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- ----------test.pl-------------------------------- use strict; use warnings; open(FILE, 'test.txt') or die "$!"; my @file = <FILE>; close(FILE); foreach my $line (@file){ if($line =~ /^さ/){ print "$line\n"; } } ------------------------------------------------ このtest.plを実行しても「さしすせそ」を抽出することが できません。 どうしたらよいのでしょうか? 自宅の新しいバージョンのperlだとできるのですが 会社のperlは5.8.8で顧客環境でもあるのでバージョンアップも できません。 すみませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • grep関数を用いた複数行からの抽出

    同じ行で重複した単語を削除したいです。 テキストファイル sapporo aomori akita iwate akita yamagata sendai miyagi hukushima miyagi akita mito ・ ・ 上記のようなファイルの同じ行で重複した単語を削除し下の形にしたいです。 sapporo aomori akita iwate yamagata sendai miyagi hukushima akita mito ・ ・ open(FILE1, "<xxx.txt") || die "File1 Open Error! \n"; open(OUT, ">zzz.txt") || die "OUT Open Error! \n"; $string1 = <FILE1>; my @array = split(/\t/,"$string1"); my %count; @array = grep {!$count{$_}++}@array; foreach my $element (@array) { print OUT "$element\t"; } close(FILE1); close(OUT); このプログラムを実行すれば初めの一行は重複した単語を削除できるのですがそこで終了してしまいます。2行目、3行目・・といったように複数行に対して重複した単語を削除するためにはどのようにすればいいのですか。宜しくお願いします。

    • ベストアンサー
    • Perl