• 締切済み

お直しお願いいたします

質問というか、お直しして貼っていただきたいのですが、以前友達に、教わってカウンターを作ったのですが、上手く動かなくなってしまいました。 プログラム言語とか全然わからないので、直したものを貼っていただけると幸いです。ソースはこれ↓です。 #!/usr/local/bin/perl $file = "./data.txt"; #変数file=./datta.txtの中身 $gif_file = "./image/"; #GIFファイルまでのアドレス(GIFファイルの入ったフォルダ) #ファイル読み込み open (FP,"$file"); #$file=data.txtを開く $data = <FP>; #変数$dataに<FP>を格納 close(FP); #ファイルを閉じる #カウント $data = $data + 1; #$dataに1プラスする処理 #ファイル書き込み open (FP,">$file"); #変数$fileに$data=<FP>を格納 print FP $data; #$dataの表示 close(FP); #FPを閉じる どうかよろしくお願いいたします。

  • konc
  • お礼率50% (3/6)
  • Perl
  • 回答数6
  • ありがとう数8

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.6

画像表示部分としてgifcat.pl の中身を示されてもね。 それをちゃんと用法に乗っ取って使っているのかどうかの方が問題です。 あなたが編集しているスクリプトの方で gifcat'gifcat() という関数を呼び出している手前で、 画像用ファイルの配列を作って、それを引数として渡していますか?? ファイル名の作り方にも問題がありそうな気がしますけど。 http://www.kent-web.com/ などで配布されているgifcat.pl を使ったカウンターを 参考にされることをおすすめします。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.5

#1です。 補足していただいたスクリプトは誰が修正した物ですか? 少しオリジナルを改編しているようですね。 オリジナルの「gifcat」を一度使ってみたらどうでしょう? オリジナルはここの一番下です。 http://www.tohoho-web.com/wwwsoft.htm

参考URL:
http://www.tohoho-web.com/wwwsoft.htm
konc
質問者

補足

すみません。やっぱりダメみたいです。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.4

#1です。 補足で貼っていただいた部分は、コメントであってスクリプト本体ではありません。 画面に表示させようとしている部分が有るはずなので、そこを載せていただきたいのですが・・・

konc
質問者

補足

これでしょうか?文字数の関係で全部張り切れませんでした。 package gifcat; $pflag = 0; $LeftPos = 0; $logicalScreenWidth = 0; $logicalScreenHeight = 0; ;# ===================================================== ;# gifcat'gifprint() - print out GIF diagnostics. ;# ===================================================== sub gifprint { $pflag = 1; &gifcat(@_); } ;# ===================================================== ;# gifcat'gifcat() - get a concatenated GIF image. ;# ===================================================== sub gifcat { @files = @_; $Gif = 0; $useLocalColorTable = 0; for $file (@files) { $size = -s $file; open(IN, "$file"); binmode(IN); sysread(IN, $buf, $size); close(IN); $cnt = 0; &GifHeader(); while (1) { $x1 = ord(substr($buf, $cnt, 1)); if ($x1 == 0x2c) { &ImageBlock(); } elsif ($x1 == 0x21) { $x2 = ord(substr($buf, $cnt + 1, 1)); if ($x2 == 0xf9) { &GraphicControlExtension(); } elsif ($x2 == 0xfe) { &CommentExtension(); } elsif ($x2 == 0x01) { &PlainTextExtension(); } elsif ($x2 == 0xff) { &ApplicationExtension(); } else { return("ERROR"); } } elsif ($x1 == 0x3b) { &Trailer(); last; } elsif ($cnt == $size) { last; } else { return("ERROR"); } } undef($buf); $Gif++; } if ($pflag == 1) { return; } $GifImage = "GIF89a"; $GifImage .= pack("C", $logicalScreenWidth & 0x00ff); $GifImage .= pack("C", ($logicalScreenWidth & 0xff00) >> 8); $GifImage .= pack("C", $logicalScreenHeight & 0x00ff); $GifImage .= pack("C", ($logicalScreenHeight & 0xff00) >> 8); if ($useLocalColorTable) { $PackedFields18[0] &= ~0x80; } $GifImage .= pack("C", $PackedFields18[0]); $GifImage .= pack("C", $BackgroundColorIndex); $GifImage .= pack("C", $PixelAspectRatio); if ($useLocalColorTable == 0) { $GifImage .= $globalColorTable[0]; } for ($i = 0; $i < $Gif; $i++) { $GifImage .= pack("CCC", 0x21, 0xf9, 0x04); $GifImage .= pack("C", $PackedFields23 | $TransparentColorFlag[$i]); $GifImage .= pack("CC", 0x00, 0x00); $GifImage .= pack("C", $TransparentColorIndex[$i]); $GifImage .= pack("C", 0x00); $GifImage .= pack("C", 0x2c); $n = $LeftPos; $LeftPos += $ImageWidth[$i]; $GifImage .= pack("C", $n & 0x00ff); $GifImage .= pack("C", ($n & 0xff00) >> 8); $GifImage .= pack("CC", 0x00, 0x00); $GifImage .= pack("C", $ImageWidth[$i] & 0x00ff); $GifImage .= pack("C", ($ImageWidth[$i] & 0xff00) >> 8); $GifImage .= pack("C", $ImageHeight & 0x00ff); $GifImage .= pack("C", ($ImageHeight & 0xff00) >> 8); if ($useLocalColorTable) { $PackedFields20[$i] |= 0x80; $PackedFields20[$i] &= ~0x07; $PackedFields20[$i] |= ($PackedFields18[$i] & 0x07); $GifImage .= pack("C", $PackedFields20[$i]); $GifImage .= $globalColorTable[$i]; } else { $GifImage .= pack("C", $PackedFields20[$i]); } $GifImage .= pack("C", $LzwMinimumCodeSize[$i]); $GifImage .= $ImageData[$i]; } $GifImage .= pack("C", 0x3b); }

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.3

「カウンターの数字の画像が一の位しか表示されなくなりました。」 ということは、質問のスクリプトは全部ではありませんよね。 (質問のスクリプトには表示させる部分が有りませんからね。) その、表示させているところが問題なので、そこを掲載しないと全く質問に答えられません。補足お願いします。

konc
質問者

お礼

すみません。長すぎて貼れないのですが、どうしたらいいでしょうか?

konc
質問者

補足

レスありがとうございますm(_ _)m スクリプトとはこれのことでしょうか? ;# ==================================================================== ;# ;# gifcat.pl: GIFファイル連結ライブラリ Ver1.57a ;# ;# Copyright (c) 1997,2001 http://tohoho.wakusei.ne.jp/ ;# ;# 著作権は放棄しませんが、自由に使用・改造・再配布可能です。 ;# ;# 基本的な使い方 ;# require "gifcat.pl"; ;# open(OUT, "> out.gif"); ;# binmode(OUT); # MS-DOS や Windows の場合に必要です。 ;# print OUT &gifcat'gifcat("xx.gif", "yy.gif", "zz.gif"); ;# close(OUT); ;# ;# デバッグ用(GIFの解析出力) ;# require "gifcat.pl"; ;# &gifcat'gifprint("xx.gif", "yy.gif", "zz.gif"); ;# ;# 制限事項 ;# アニメGIF同士を連結することはできません。 ;# アニメGIF対応のブラウザでなければ、最初の画像しか表示されません。 ;# 高さの異なるGIFファイルは連結できません。 ;# ;# 最新版入手先 ;# http://tohoho.wakusei.ne.jp/ ;# ;# ==================================================================== 続き↓

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

直すところはありません。正しいPerlスクリプトです。 ただし、Webアクセスカウンタとしては、 ・排他制御がなされてない。 ・カウンタを出力(HTMLもしくはイメージで。)する記述がない。 ――と使い物にならないので、これは捨ててしまって、出来合いのカウンタスクリプトをどっかから拾ってきた方が、簡単かつ確実だと。 目的が、Perlプログラミングの学習にあるのなら、問題点を明確にしてから質問した方が回答がつきやすいと思います。

konc
質問者

お礼

ご回答ありがとうございます。 排他制御とカウンタ出力はどうしたらできるのでしょうか?このプログラムに付け足すことはできないでしょうか?カウンターはおかしくなりましたが、カウントはずっとしているようで、それを引き継ぐ形で乗り換えるなら他のに乗り換えたいと思うのですが、数字の一桁目しか表示されないので、今どれくらいカウントされているのかわかりません。 問題は、カウンターの数字が1桁しか表示されないことです。 どうにかならないでしょうか?

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

「上手く動かなくなってしまいました。」 とは、具体的にどのような症状が出ているのですか? >print FP $data; #$dataの表示 これは表示ではなくカウントアップしたデータを再格納しているだけなので、画面には表示されないでしょう。

konc
質問者

お礼

レスありがとうございます。 >「上手く動かなくなってしまいました。」 >とは、具体的にどのような症状が出ているのですか? カウンターの数字の画像が一の位しか表示されなくなりました。 画面に上手く表示させるにはどうしたら良いのでしょう?

関連するQ&A

  • CSVデータの同じファイルに上書きするには。

    CSV形式でデータdata.csvが書いてあります。プログラムを実行して、そのファイルの$data[4]の値が5という数字だった場合は、そこのセルだけ"解除"という文字に置き換えて(ほかに入ってる値ははそのまま)data.csvに上書きしたいのですが、どうもうまくいきません。したのように記述したのですが、どこが間違っているのかがわかりません。。どなたか教えてください。よろしくおねがいします。 #!/usr/bin/perl $file='data.csv'; open(FILE, "$file"); while(<FILE>){ @data = split(/,/, $_); } close(FILE); if($data[4] eq "5"){$data[4] = "解除";} open(OUT, ">$file"); print OUT @data; close(OUT);

  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • CGIでファイルが読み込めない

    CGI初心者です。 (osはlinuxです。) #!/usr/local/bin/perl use strict; use CGI; my $file=new CGI; open(DATA,"/home/data.txt"); $file=<DATA>; close=(DATA); print "Content-type: text/html\n\n"; print "data=$file"; このスクリプトで、/home/data.txt(フルパスです)に書かれているデータを1行だけをブラウザで表示させたいのですが、表示できません。 どこがおかしいのか教えてください。 ちなみにdata.txtには実際に「abc」という文字1行しか入れていません。

    • 締切済み
    • CGI
  • テキストファイル内の変数を展開して出力したい

    テキストファイル内に変数を書いておいて、出力時に その変数を展開させる方法を教えてください。 具体的には、[test.txt]を[出力]のようにしたいのです。 ためしに[test.cgi]を作ったのですが[test.txt]の内容がそのまま出てきてしまいました。 [test2.cgi]ができるなら、[test.cgi]でもできると思っていたのですが… [test.cgi] #!/usr/local/bin/perl $moji="OK"; print "Content-type: text/html\n\n"; open(IN, 'test.txt'); while (<IN>) { print "$_"; } close(IN); exit; [test2.cgi] #!/usr/local/bin/perl $moji="OK"; $naka="<HTML><BODY>$moji</BODY></HTML>"; print "Content-type: text/html\n\n"; print "$naka"; } close(IN); exit; [test.txt] <HTML><BODY>$moji</BODY></HTML> [出力] <HTML><BODY>OK</BODY></HTML>

    • ベストアンサー
    • Perl
  • PERL カンマ区切り 一致行削除

    教えてくださいm(_ _)m 最初に目的を書きます・・・ ~test.txt~ 1,aaa,eee,ttt 3,eee,eee,yyy 5,ttt,yyy,eee 2,yyy,bbb,qqq ↓ 5,ttt,yyy,eee 2,yyy,bbb,qqq ~~~~~~~~~~ 例1)、カンマ区切り3列目が「eee」 の行を全て削除(完全一致) 例2)、カンマ区切り3列目が「e」を含む 行を全て削除(部分一致) というふうにしたいのですが、 どのようにするのかわからないです・・・ 現在下記のように とりあえず1行目(0番目)を削除するとこまできました。 #! /usr/bin/perl $TEST = 'test.txt'; open(FILE, "<$TEST"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $NO = 0; splice @DATA, $NO, 1; open(FILE, ">$TEST"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE;

    • ベストアンサー
    • Perl
  • perlでデータベースに接続したい。

    PerlでCSVに保存されている内容を確認したい時、 #!/usr/bin/perl $file = 'xxx.csv'; open(TXT, "+>$file"); print << __PRINT__; content-type:text/html <html><head><title>表\示</title></head> <body>$file</body></html> __PRINT__ exit; こういった感じでブラウザに表示できるかと思いますが、 データベースに保存されている内容をブラウザ表示したい時は、 どんなソースになりますか?

    • ベストアンサー
    • MySQL
  • SSIの実行

    アクセスカウンタ作成についての質問です。 あるプロバイダが提供している領域を使い、 public_htmlフォルダ直下に count.cgi、count.shtmlというファイルを置き、 count.shtmlからcount.cgiを呼び出して、 自前のアクセスカウンタを実行しようとしましたが、 アクセス数の部分が表示されず困っています。 ("カウント数は"の後が空白で何も表示されません。 エラー表示等はありません) チェック方法項目等ありましたらお教え頂けません でしょうか。 よろしくお願い致します。 ※public_htmlフォルダ及び、対象2ファイルには  それぞれ755のパーミッションを設定しています。 以下、html文です。 ------------------------------ <html> <head><title>アクセスカウンタ</title></head> <body> カウント数は <!--#exec cgi="./count.cgi"--> </body> </html> 以下、CGIプログラムです。 ------------------------------ #! /usr/local/bin/perl $filename = "count.txt"; if (!open ( FP, "$filename")) { $no = 0; } else { $no = <FP>; close(FP); } $no++; print "$no" if (!open ( FP, ">$filename")) { print "ファイル $filename がオープンできませんでした ($!)\n"; } else { print FP $no; close(FP); }

    • 締切済み
    • CGI
  • 文字列をカウントするにはどうすればいいのでしょうか?

    ファイル読み込み後その中の特定の文字列、「映画」の個数をカウントするというプログラムを次のように作ってみましたが、実際に起動してみるとエラーになります。何かわかる方がいれば教えてください。 #!/usr/local/bin/perl if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } foreach $count (@file){ $count = ($line =~ tr/映画/映画/); } print $count; exit;

    • ベストアンサー
    • CGI

専門家に質問してみよう