Perlを使用したファイル入出力に関する質問

このQ&Aのポイント
  • ファイル入出力を行うためのPerlプログラムを作成していますが、保存や読み込みがうまくいかず困っています。
  • 最頻出単語を表示する機能や、保存された文章の数をカウントする機能を実装していますが、うまく動作しません。
  • どなたかアドバイスをいただけないでしょうか。
回答を見る
  • ベストアンサー

ファイル入出力 ~perl~

以下のようなプログラムを作っています。(CGI,perlプログラム使用) 1.HTML文章中に textareaを設置。 2.ユーザがtextareaに文章を入力(英語)。 3.submitボタンを押すと、Perlプログラムが最頻出単語を読み取り、「This story is about "その最頻出単語を表示 " We have n stories about the topic. If you wish to see it, please click here.」 この際、a,the,I,youなど、topic内容に関係の内単語を排除。 文章の最後のhereをクリックすると、今までユーザが保存した同じtopicに関するデータを見れる仕組みになっています。 さて、質問なんですが、 今、submitボタンによって提出された文章をサーバ上に保存するところで困っています。 以下のような、ファイル入力のプログラムを書きました。 $fileName = $word . ".dat"; #word は読み込んだ最頻出語 open FH, "< $fileName" or die; $numberOfStory++; print $stored; #stored はtextareaから読み込んだ文章。 print "\n\n\n"; close (FH); この記述で、 ファイルを読み込むまたは、作ってサーバ上のデータベースに保存しようと試みましたが、プログラムが動きません。 また、$numberOfStoryという整数型の変数を利用することによって、保存された文章の数も数えたいのですが、やり方がわかりません。 どなたかアドバイスをいただけないでしょうか。 よろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • kalze
  • ベストアンサー率47% (522/1092)
回答No.2

ファイルに保存する部分だけを説明すると。 ・ファイルを開く ・ファイルに書き出す ・ファイルを閉じる という処理が必要になります。 上記の処理は、以下の通り。 open FH, "<< $fileName"; print FH $stored; close FH; ※例外処理は記載していません。 問題は、ファイルフォーマット。 1つの文章をどのように格納するか。 それによって具体的な出力処理が変わってくるでしょう。 また実際には、ファイルを開くときにもチェックが必要でしょう。 ファイルがあるかどうかチェックして、あれば追記モードで、なければファイルを作ってから追記モードで開くか上書きモードで開いてファイルを同時に作らせるかなど。 質問者さんの書かれている処理で、ファイルに出力できない理由は、2つあります。 open FH, "< $fileName" or die; この部分で、読み込み専用でファイルをひらいていること。 print $stored; というところで、ファイルハンドラを指定しておらず標準出力に出力していること。 openのときに書き込みができるモードで開き、printでファイルハンドラを指定することで、ファイルに出力できるようになります。 とりあえずファイルへの出力に関しては以上でできるはず。

ilnmfay
質問者

お礼

回答ありがとうございます。 おかげさまで、自分で納得のいき、正確に動くプログラムを作ることができました。 的確なアドバイスありがとうございました。

その他の回答 (1)

  • kalze
  • ベストアンサー率47% (522/1092)
回答No.1

>$fileName = $word . ".dat"; #word は読み込んだ最頻出語 >open FH, "< $fileName" or die; $fileaName変数に格納されているファイル名のファイルを読み込み専用で開き、ファイルハンドラをFHとする >$numberOfStory++; >print $stored; #stored はtextareaから読み込んだ文章。 $stored変数の中身を標準出力に表示 >print "\n\n\n"; 標準出力に改行を3つ出力 >close (FH); ファイルを閉じる ファイルに関連する処理がありませんが、ファイルはなんのために開いたの? >今、submitボタンによって提出された文章をサーバ上に保存するところで困っています。 ということですから、データをサーバ上のファイルに保存したいのですよね? >以下のような、ファイル入力のプログラムを書きました。 なにがしたくて? なんかやりたいことが文章にまとまっていないので、もう少しやりたいことを簡潔にまとめてもらえますか? 行いたい処理を箇条書きでいいので、順に書くとか。

ilnmfay
質問者

補足

文章がまとまっていなくてすみません。ご指摘、ありがとうございます。 textareaから文章を得る。 ↓ 得た文章中の最頻出単語を表示。 ↓ 最頻出単語ごとにデータベースを作って保存。 例えば、user1の文章の最頻出がamericaだったら、サーバ上にamerica用のファイルを作って保存。 ↓ 「もしその最頻出単語のデータベースを見たかったら、ここをクリック」 という文章を表示し、アクセスできるようにする。 例えば、上のuser1の例では、「ここ」をクリックすると、これまでのuserによってamericaファイルに保存された文章が見れる。 ↓ 同時に、ファイル内の文章の数も表示。 というのが僕のやりたいことです。 サーバに文章を保存するところで困っています。

関連するQ&A

  • textareaの内容をPerlプログラムに送る

    現在、次のようなプログラム(Perl)を作っています。 「ユーザがホームページ上のtextareaになんらかの短いストーリーを書き込む(英語)。submitボタンを押すとその文章の中から一番多い単語をPerlプログラムが読み取って、その後ホームページ上に  "Your story is about ..." (...にはその読み取った英単語を表示)と表示。ただし、a,the などの特に文章の内容に関係内単語は削除するようにプログラムを組む。 その後、We have the "n" stories talking about "..." If you want to see them, please click here. と表示。(読み取った英単語に関するストーリーを私たちはすでにn個持っています。もしそれを見たかったらここをクリックしてください) nは今までユーザからもらったストーリーの数をプログラムにより表示。 おおまかにこんな感じのプログラムを作っています。 Perlのプログラム(出現回数の多い英単語を探し出す)はできました。、 (1)HTMLのtextareaとそのプログラムを以下にしてつなげるか。 textarea のタグ内に name ="story"として、プログラムに$storyとすればtextarea 内の文字をgetできるのでしょうか? (2)データを保存  データベースに storyを保存する方法がわからず困っています。 post やgetを使えばよいのでしょうか? 長文すみません。 アドバイスしていただけるかたがいらっしゃれば、よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 一番多い文字の検索

    Perlのスクリプトを用いて次のようなCGIプログラムを作ろうとしています。 「ユーザがインプットした文章(何かしらのストーリー)をsubmitして もらい、Perlプログラムを用いて、その文章の中にでてくる最頻出の単語を読み取る。(ここで文章は英語であり、最頻出の単語はa,the など文章の内容に関係のない言葉は排除する。)Perlプログラムで読み取った最頻出の単語を ユーザに表示。」 最頻出の単語を読み取る という部分で 苦戦しているのですが 何がアドバイスをいただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでのファイル一括読み込み

    Perlにてファイルの一括読み込みを以下記述で実施しております。 実行環境はAIXです。 ------------------------------- #!/usr/bin/perl open(FH,"/tmp/filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- 上記内容をWindows XPにて実行した場合、何も表示されません。 print文が動いていないのか、ファイルの読み込みができていないのか不明です。 ファイルのパスは以下のように変更しております。 ------------------------------- open(FH,"C:\filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- Windowsにて動作するようにはどのようにすれば宜しいのでしょうか? 初歩的な質問かもしれませんが、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • テキストエリアのインプットをPerlプログラムへ

    基本事項だと思うのですが質問させてください。 まず、HTMLファイル上に <form method= "post" action ="http://localhost/test.cgi> <textarea name ="story" cols="60" rows="10"> This is a test. </textarea> ... <input type="submit" name="submit_story" value="submit"> とプログラムを組みます。 その後、perlプログラムにテキストエリアの内容を送りユーザがsubmitボタンを押したときに HTMLファイルとして出力します。 そのPerlは以下のように組みました。 print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>The test of CGI</title>\n"; print "</head>\n"; print "<body>\n"; $story = $_POST["story"]; print "<p><h3>Textarea says $story </h3></p>\n"; print "</body>\n"; print "</html>\n";  しかし、$storyは表示されませんでした。 どこがおかしいのでしょうか? もしよければアドバイスをお願いします。

    • ベストアンサー
    • CGI
  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • perl localhostでgifを表示するには

    超初心者からプログラムを初めて1週間、 プログラム言語にはperlを使用しています。 mac os x です。 perlの教科書読みながら、アクセスカウンタを作ろうとした所、 何故かgif画像が表示されません。 ネットの素材置き場からとってきましたが、パソコン自身、gif自体は認識してくれてます。 ただ、それをperlに組み込んで使おうとすると、表示されません。 ブラウザはfirefoxとsafariで試しましたが、両方認識してくれませんでした。 ちなみにソースは ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ2</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>\n"; foreach $fld (split (// , $cnt)){ print "<IMG SRC=\"${fld}.gif\">"; } print"</CENTER>\n"; if ( open(FH, ">count.txt" )){ print FH $cnt; close(FH); } else { print "ファイルの書き込みオープンに失敗しました。\n"; } } else { print "ファイルの書き込みオープンに失敗しました。\n"; } print "</BODY>\n"; print "</HTML>\n"; __END__ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー です。 テキストファイルを確認しているので、 perl 自体の活動と、アクセスのログ?自体は正常に動いているみたいです。 お願いします。 助けてください!

    • ベストアンサー
    • Perl
  • 携帯サイトでのPerlのtextarea容量

    はじめて質問させていただきます。  Perlを使って携帯サイトを作成しています。 以前にtextareaで作成した文章をファイルに保存しておき 再度、編集する際に以前の文章データをtextareaに表示しようとしました。  以前の文章データの容量が小さい場合は問題なくtextareaに表示されるのですが、 以前の文章データの容量が大きい場合は後半部分が欠けてしまいます。  PCでは問題なく表示されるのですが・・・・ どなたか、ヒントでも教えていただければ幸いです。  なお、ソースの一部は以下の通りです。 よろしくお願いします。    記 #----------naiyou1.datの読込み--------- open( LOAD,"naiyou1.dat"); $naiyou1 = <LOAD>; close(LOAD); #---------文字の逆処理------------------ $naiyou1 =~s/&amp;/&/g; $naiyou1 =~s/&lt;/</g; $naiyou1 =~s/&gt;/>/g; $naiyou1 =~s/<br \/>/\n/g; #----------表示(内容1の変更:)---------------- print "<br />内容の変更:<br />\n"; #----------TEXTAREA($naiyou1)----------------------------- print "<form method=\"$GO\" action=\"$cgi_name\">\n"; print "<textarea name=\"naiyou1\" rows=\"7\" cols=\"25\"wrap=\"hard\">$naiyou1</textarea>\n"; print "<input type=\"hidden\" name=\"label\" value=\"811P\" />\n";#label811Pに飛ぶ print "<br /><input type=\"submit\" value=\"決定\" /><br />\n"; print "</form>\n"; 以上

  • CGIで外部ファイルに書き込みができません

    Perl初心者です。 外部テキストファイルに、HTMLのフォームで入力した情報を書き込み、それを読み込んでHTMLで表示するコードをつくろうとしているのですが、外部ファイルに書き込みができません。(読み込みはできます) コードは以下のとおりです。 #! /usr/bin/perl use strict; my $self = "test.cgi"; my $str = <>; my $filename = "log.txt"; open FH,">$filename"; print FH $str; close FH; my $body; open FH,"<$filename"; my $str2 = <FH>; $body = $str2; close FH; print "Content-type: text/html\n\n"; print <<Q; <html> <head><title>jjj</title></head> <body> <form action = "$self" method = "POST"> <input type = "text" name = "data01" /> <input type = "text" name = "data02" /><br> <input type = "submit" value = "soushinn" /> <hr/> $body </form> </body> </html> Q 環境はMac OS 10.4.11、Apacheを起動して、ローカルでテストしています。 パーミッション等、いろいろ試しましたが、なぜ書き込めないのかよく分かりません。 どなたか原因を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlでCSV形式ファイルのアップロード方法

    perlでCSV形式ファイルのアップロード方法を教えてさい。 htmlで <HTML> <BODY> <FORM action="excel読み込み.cgi" enctype="multipart/form-data" method="post"> フレアシステムのファイル: <INPUT type="file" name="upload_file" size="60"><BR> <INPUT type="submit" value="読み込み"> </FORM> </BODY> </HTML> として、ファイル名の指定をして、読み込みボタンを押すと、excel読み込み.cgiを呼び出すのですが、プログラムの内容が表示されるだけで終わってしまいます。 excel読み込み.cgiのプログラムは以下の内容です。 #! c:/perl/bin/perl use CGI; $query = new CGI; $filename = $query->param('upload_file'); while(read($filename, $buffer, 2048)) { $file .= $buffer; } @files = split(/\\/, $filename); ($basename, $exp) = split(/\./, $files[-1]); $new_file = $basename . "." . $exp; # ファイルを指定ディレクトリにコピー #open(OUT, "> c:\\foo\\$new_file"); open(OUT, "> c:\\$new_file"); binmode(OUT); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "[$basename] [$exp]\n"; print "正常終了\n"; exit; CGIのプログラムを色々と調べて、別のないようにしても同じようにプログラムがそのまま表示されてしまいます。 どなたか教えてください。 宜しくお願いします。

  • ファイルへの追加書き込みについて

    こんにちは。Perlを勉強しはじめた者です。 test1.plファイルにtuika.plを起動することで追加書き込みをしようとしているのですが、 その書き込みをプログラムの途中に行おうとしています。 内容としては、test1.plが文字置換を行うもので、その候補をtuika.plで入れてやります。 tuika.pl #!/usr/local/bin/perl use strict; use vars qw($oldword $newword); print "置換元の単語は? \n"; $oldword = <STDIN>; print "置換後の単語は? \n"; $newword = <STDIN>; open (FH, ">>test1.pl") or die "error $!\n"; seek FH, -47, 2; print FH "s/$oldword/$newword/og;\n"; close FH; seek関数は実際には途中書き込みには対応していない(?)ようなので、書き込みが末尾にきてしまい、うまくいきません…。 初心者な質問で申し訳ありませんが、なにか解決策がございましたら、ご教授願います。

専門家に質問してみよう