• ベストアンサー

データの読み込み方法

CGI@Perlの質問です。 下記のような内容のdata.txtファイルがあります。 すべてを読み込みブラウザで表示する方法は本により理解をしたのですが、 このスクリプトを改良して、二行目のみを取り出し表示したり、 文字列(例:「ニ」がある行だけを表示)を検索して表示したいと思っています。 どなたかスペシャリストの方、下記のスクリプトに手を加え 分かりやすくご説明していただけないでしょうか? よろしくお願いいたします。 ○全部表示するスクリプト------------------------- #user/local/bin/perl $count = 1; print"Content-type:text/html\n\n"; print<<EOF; <html> <head> <title>テスト</title> <head> <body> EOF open(DATA,"data.txt"); while($count <= 3){ $data = <DATA>; print "$data<BR>"; $count++; } close(MENU); print<<EOF; </body> </html> EOF exit; ------------------------------------- 【data.txt】 一行目のテキスト 二行目のテキスト 三行目のテキスト

  • umioo
  • お礼率65% (29/44)
  • CGI
  • 回答数3
  • ありがとう数2

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

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

>現在、data.txtは3行しかないと分かっているので >$count <= 3としていますが、もしdata.txt内に >何行のデータがあるかわからない場合は、どのような >書き方にすると良いか教えていただけないでしょうか? と言う事で…再投稿です。 #$data = <DATA>; @data = <DATA>; # $→@へ変更 foreach $line (@data) {# ファイル内容から一行だけ取得 if ($line =~ /二/) { # $dataを$lineへ変更   print "$line<BR>"; # $dataを$lineへ変更 } } これならば[data.txt]の内容が0行であっても、1万行であっても対応出来る…(筈w)。

umioo
質問者

お礼

何度もありがとうございます。 本当に助かりました!!

その他の回答 (2)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

open(DATA,"data.txt"); while(<DATA>){ #一行ずつ読む if(/二/){print "$_<BR>";} #二の文字を発見→出力 } close(MENU);

umioo
質問者

お礼

なるほど! (<DATA>)とすると一行づつ読み込めるんですね。 大変勉強になりました。 ありがとうございます。

回答No.1

$data = <DATA>; if ($data =~ /二/) { #ここを追加  print "$data<BR>"; } #ここを追加 たぶん、これで動いた様な。。

umioo
質問者

補足

早速のご返答ありがとうございます。 ばっちり動きました!!! あともう一つ質問があるのですが、 現在、data.txtは3行しかないと分かっているので $count <= 3としていますが、もしdata.txt内に 何行のデータがあるかわからない場合は、どのような 書き方にすると良いか教えていただけないでしょうか? 何度も申し訳ありませんが、ご教授いただければ幸いです。よろしくお願いいたします。

関連するQ&A

  • cgiのopenについて

    cgiのopenを使って下記のソースを作りました。 が、読み込んだテキストの一行目しか読み込みませんToT require 'cgi-lib.pl'; &ReadParse(*answer); $data = "$answer{'text'}"; require 'jcode.pl'; &jcode'convert(*data,'sjis'); open(dataright,"<data.txt"); $data= <dataright>; close(dataright); print "Content-type:text/html\n\n"; print <<EOF; <html> <head> <title>メール送信フォーム</title> </head> <body> ------------------<br> お知らせ<br> $data ------------------<br> </body> </html> EOF exit; ちなみにテキストは改行に<br>を入力してあります。 ぜひアドバイスをお願いいたします。

    • ベストアンサー
    • CGI
  • textareaへデータ表示(改行変換)

    こんにちは。 データベースから取得したデータを編集する仕組みを作っています。 下記のサンプルは単純化したもので、データベース部分は省いています。 <?php print <<<EOF <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> EOF; $test2 = "こんにちは<br />さようなら"; $test2 = str_replace("<br />","\n", $test2); //この1行に問題あり? print <<<EOF <script type='text/javascript'> function ListToField(){ document.getElementById('aaa').bbb.value = "$test2"; } </script> <a href='#' onClick='ListToField()'>テスト</a> <br> <form id="aaa" action="ccc.php" method="post"> <textarea name='bbb' id="bbb" cols=20 rows=2>$test</textarea> </form> </body> </html> EOF; ?> 「テスト」をクリックしたときに、<br>を\nに変換したものをtextareaに表示させたいのですが、何も表示されません。 テキストエリアの「$test」は別に使用するので、このまま置いておきたいのです。 あくまで、「name='bbb'」をたよりに$test2の中身を渡したいのですが、 改行が入っていると渡せないのでしょうか? プログラミング初心者で、いろいろ調べてもよくわかりませんでした。 ご教示いただけると嬉しいです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • ポーリングとHTMLデータのリロードの方法

    次のことをするcgiを作りたいのですが  1. 起動したらデータを読み込み、その内容を表に表示。(即時)  2. 5秒ごとにデータを読みに行き(ポーリング)、変化があったら表を    リロードして新しいデータの表を表示する。 下記のようにすると、リロードされずに表がいくつも表示されてしまいます。 (リロード処理を入れてないので当たり前なんですが) また、その表示が5秒ごとではなく、かなり長い時間(数十秒?)たってから 1度に数個表示されるというのを繰り返してしまいます。  Q1 リロードさせるには、javascriptを使えばよいのかと思うのですが、    どのようなスクリプトを使えばよいのでしょうか。    また、javascriptでなくても他に方法があれば教えてください。    (Perlのプログラム上では無理でしょうか)  Q2 起動時にまずは最初のデータを表示させたいのですが、sleeを使うと    起動後すぐ表示されないように思いますが、どのようにしたらよい    でしょうか。 なお、下記テストプログラムでは、データを更新して表示する処理は 省いています。 よろしくお願い致します。 ------------------------- $kaisuu = 0; $change = 0; while (1) {   &data;   if($kaisuu == 0 ){     &hyou;     $kaisuu = 1;   }elsif (($kaisuu == 1) && ($change == 1)){     &hyou;   }   sleep 5; } sub data {   #データの読み込み処理   if(データに変化あり){     $change = 1;   } } sub hyou {   print "Content-type: text/html\n";   print "\n";   print "<html>\n";   print "<head>\n";   print "<title>Test</title>\n";   print "</head>\n";   print " <table border=2 frame=border>\n";   print " <tr><td>項目</td>\n";   print " <td>名前</td></tr>\n";   print " <tr><td>1</td>\n";   print " <td>まるまる</td></tr>\n";   print " <tr><td>2</td>\n";   print " <td>ばつばつ</td></tr>\n";   print " </table>\n";   print "</body>\n";   print "</html>\n"; }

    • ベストアンサー
    • Perl
  • iis+cgiでmultipart/form-data送信がうまくいかない

    これまでLinux+Perl/CGIで構築していたWEBサーバをIIS+Perl/CGIに移す必要が生じ、新規にIISによるWEBサーバを構築しました。 一気にコンテンツを移動してもハマるだけだと考え、まずは簡単なコードを記述しCGIが動作するかどうかテストしています。 POSTによるinput type=textのデータ表示まではうまく行きましたが、ファイルアップロードのところで詰まりました。 IIS(Windows)によるWEBサーバの構築は初めてで、何が問題なのかサッパリわかりません。 どなたか問題点あるいはどこをチェックすれば良いかご指摘いただけませんでしょうか。 ●やった事 PerlにてPOSTを利用しmultipart/form-dataにてファイルをアップロードするシンプルなコードを書き、第一段階としてMIMEエンコードされたものをブラウザ上に表示するしようとしてみた。 コードは最下方の通り。 ●症状 送信を実行してもアップロード中のまま(ウィンドウマークが動き続けている)で、IISに設定してある10分程のタイムアウト時間を過ぎて終了してしまう。 TXT、XLS、DOCなどファイル種を変えて試しても全く同じ症状。 ●環境:Windows2000ServerSP4 IIS5.0 Perl5.8.8 *******アップロード画面****** <HTML> <HEAD> <TITILE>ファイルのアップロード</TITLE> </HEAD> <BODY> <FORM ACTION="/cgi-bin/upload.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> ファイル: <INPUT TYPE="file" NAME="File" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> </BODY> </HTML> **********ここまで*********** *******CGI******************* #!/perl/bin/perl read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); print "Content-type: text/html\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>test</TITLE>\n"; print "</HEAD>\n"; print "<BODY BGCOLOR=\"#ffffff\">\n"; print "$buffer"; print "</BODY>\n"; print "</HTML>\n"; exit; ********ここまで***********************

    • ベストアンサー
    • CGI
  • tsvファイルの読み込みエラー

    ファイル読み込み後、内容表示するプログラムをつくったのですが、tsvファイルを読み込むとWEB画面には何も表示されず真っ白になってしまいます(普通のtxtファイルでもタブが入っていると表示しません)。tsv読み込み時は何か設定が必要なのでしょうか? #!/usr/local/bin/perl print "Content-Type: text/html\n\n"; print "<html>\n"; print "<head><title>サンプル</title></head>\n"; print "<body>\n"; if (open(FH, "data/block.txt")) { @file = <FH>; close(FH); print "<p>ファイルの内容は、<br>\n"; foreach $data (@file) { print "$data<br>"; } print "です。</p>\n"; } else { print "ファイルを読み込めません。"; } print "</body>\n"; print "</html>\n"; exit;

  • 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
  • 正規表現<置き換え>が実行してくれません

    次のようなスクリプトで、改行マーク\nがたくさんある1行データを<BR>に置換しようとしましたが、表示は\nのままです。原因が分かりません。たぶんこの肝心の箇所のスクリプト・エラーだと思いますが、自分で発見できません。どなたかお教え下さい。 print "Content-type: text/html; charset=sjis-jp\n\n"; print "\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE></TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; # 辞書を読む #ファイルの各行を配列に一括して読み込む。 open(IN, "GermJ.txt"); @list = <IN>; close(IN); $max = $#list; for ($i=0; $i<$max; $i++) {$data = @list[$i]; if (index($data, $tango.' /// ')==0) {$data=~ s/ \n/<BR>/g; print "$data\n"; last; } } print "</BODY>\n"; print "</HTML>\n"; __END__

    • ベストアンサー
    • 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
  • ヒアドキュメントでHTMLを書いて次へをクリックするとサブルーチンが表示される方法は?

    こんにちわ。perlでCGI学んでます。初心者です。 CGIの中にヒアドキュメントでHTMLを書きました。 そのページの最後に「次のページへ」というフォームボタンをつけました。ボタンをクリックするとサブルーチンの次ページが表示されるようにしたいのですが、うまくいきません。ボタンはinputタグのボタンにしたいので、テキストリンクにはしません。 「次のページへ」をクリックするとサブルーチンのpage1の中が表示されるようにするにはどうしたらいいですか?hiddenタグをボタンの下に書けばいいといわれたのですが、どうもうまくいきません。ご存知のかた、ご教授願います。 以下のようにソースを書きましたがうまくできません。。。。 #!/usr/bin/perl $script="test.cgi" print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF }

    • ベストアンサー
    • CGI
  • perl の printでのファイルへの指示にて

    独学でmacでパールを勉強しています。 始めてからまだ1週間くらい。 教科書みながら、print命令でファイルハンドルに指示を出してるのですが、 書き込めはできるのですが、 ファイルが無い場合、 新規に自動でファイルが作成されるはずとの記載があったのですが、 何故か、自動でファイルが生成されません。 調べても、設定が必要等言われてますが、 mac自体も初心者でほとんどわかりません。 どのような設定にすればいいのでしょうか? また、ソースに何か悪い所があるのでしょうか? お助けください。   ちなみに下記がソースです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>あなたは${cnt}人目の訪問者です。</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

専門家に質問してみよう