• ベストアンサー

別データファイルを流し込むタイプのcgiで教えてください。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1225153 でフローチャート式のフリーcgiをご紹介頂きました。 データも流し込んでうまく動くようになりました。 このファイルはdataファイルが別にあり $datfile = './heart_sm.dat'; のように定義してから呼び出すタイプです。 別ウィンドウで小窓として表示したいので スクリプトを書き無事動作確認できました。 問題1 結果文が長いので流し込んだテキストの大きさを 変えたいのですが、枠や周りの大きさは 変わるのですが、中の流し込んだテキストは 大きさがかわりません。大きさを変えるには どうすれば良いでしょうか? 問題2 結果文にリンクを張って親ウィンドウに 戻したいのですが、単純にdatfilesに ハイパーリンクを書き込んだだけでは 認識してくれません。 良い方法はありませんか? 長いのでデータを読み込むときを 抜粋して書き込みます。 よろしくお願いします。 #--------------------------------------------------------------- sub read_data{ #データファイルの読み込み open(FILE,"$datfile") or error("データファイルが開けません。"); @data = <FILE>; close(FILE); for(@data){ chomp; next if(/^#/); @data_line = split/<>/; $data_no =$data_line[0]; if($data_no eq $Now_no){$find = 1; last} } if($find){ @data_type = split(/:/,$data_line[1]); if($data_type[0] eq "a"){ $mess1 = $data_line[3]; $Yes_no=@data_type[1]; $No_no=@data_type[2]; out_put1(); } elsif ($data_type[0] eq "b") { $mess1 = $data_line[3]; $Next_no=@data_type[1]; out_put2(); }else{ log_write(); result_print(); } } }

  • CGI
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • Fukutarou
  • ベストアンサー率30% (193/641)
回答No.1

データの変更ではなくCGIの変更で行ってください。 1の回答 cgiの結果文(提案)の所で <P>$mess1 に<p><font size=2>$mess1</font> にすればタグ内のサイズが指定出来ます。 2の回答 先の行に <br> <A HEF="http://***" TARGET="_top"><font size=3>戻る</font> で下に張り付けすれば良いのでは?

kanarin_777
質問者

お礼

教えてくださってありがとうございます。 助かりました!! 1については出来ました。 2なんですけど、回答パターンが複数あって その先のhtmlが回答別に違うものを作りたいんです。 難しいですよね? とりあえずはフッターの部分にリンクを設定して パターン別の一覧を出せばいいかと単純に 考えてます。

その他の回答 (3)

  • Fukutarou
  • ベストアンサー率30% (193/641)
回答No.4

#1~3です。 訂正 $link=$date_line[4]; でした。 得意な分野でないので、自信ありません。^^;

kanarin_777
質問者

お礼

なんとか出来ました!!ありがとうございました。

  • Fukutarou
  • ベストアンサー率30% (193/641)
回答No.3

データに追加とは、heart.datファイルの 34<>b:15<>10:原因No.34:診断結果No.34<> メッセージNO.34<>a(ここ) に追加することです。 34の結果表示にaを返して その列を$linkと定義し呼び出し sub out_put2{ の所に <P>$mess1 </TD></TR> </TABLE><BR> <A HEF="../$link.html" TARGET="_top"><font size=3>判定は?</font> を追記する方方法です。 bでおしまいであれば、上の方法として if($data_type[0] eq "a"){ $mess1 = $data_line[3]; $Yes_no=@data_type[1]; $No_no=@data_type[2]; $link=@date_line[4]; となるかも ソース見ただけなので実際よくわかりません>< ごめんなさい。

kanarin_777
質問者

お礼

こんにちは。いろいろとアドバイス ありがとうございます。 結果表示はbでおしまいにする方法なので 34<>b:15<>10:原因No.34:診断結果No.34<> メッセージNO.34<>a $link と書いて sub out_put2{ の所に <P>$mess1 </TD></TR> </TABLE><BR> <A HEF="../test.html" TARGET="_top"><font size=3>判定は?</font> を追加し、さらに 提案の所に if($data_type[0] eq "a"){ $mess1 = $data_line[3]; $Yes_no=@data_type[1]; $No_no=@data_type[2]; $link=@date_line[4]; を追加したんですが、 ページが表示できませんでした。 if~の文は追加する場所によって動かなく なるってことはありますか? 何度もすみません。

  • Fukutarou
  • ベストアンサー率30% (193/641)
回答No.2

#1です。 okwebが重すぎてうまく書き込めないですが、 2の方法としては データベースの区切りが<>で有るため、タグを書き込めないと言う所に有るようです。 @data_line = split/<>/; を @data_line = split/\,/; に変更して、データベースの区切りを,(カンマ)にし、結果文の最後に <A HEF="http://***" TARGET="_top"><font size=3>判定は?</font>を追加するとか出来ないでしょうか? すごく自信有りません。 他にはデータにもう一つデータを追加し、タグ$linkで呼び出す方法も有りますが。 とにかくがんばってください。

kanarin_777
質問者

お礼

お礼が遅くなってすみません。とりあえず<>を,に変えてみたんですけどやっぱり認識しないみたいです。タグ$LINKで呼び出す方法っていうのはdatファイルをもう1つ作ってとかそんな感じなんでしょうか? 質問ばっかりですみません。

関連するQ&A

  • ファイルの読み込み処理が上手くいきません。

    aaaフォルダ配下のファイルfruits.csv(タブ区切り2列)の1列目の内容が@dbline[1]の内容と等しいものについて、2列目の内容を$Hinmeiに取り出すプログラムを以下のように作成しましたが、他の変数の領域を壊しているようです。何が問題なのかご教示下さい。 因みにif文を何個も使用して条件に合うものの品名を取り出すことはできますが、if文が増えてしまい、見栄えが良くありません。 open (FILE,"../aaa/fruits.csv”); while (<FILE>){ chomp $_; @data=split(/\t/,$_); if(@dbline[1] eq @data[0]) { $Hinmei=$data[1]; last; } } close(FILE);

    • ベストアンサー
    • Perl
  • 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によるディレクトリ内の連続的な大量データ処理

    Perlのテキスト処理に関する質問です.やりたいことはあるディレクトリ内に10000個ほどの(1)のようなテキストデータがあります.ここで私は(2)のプログラムを作成しました.しかしながら,このプログラムだと10000個あるテキストデータの一つしか処理できません.この処理内容をディレクトリ全体に適用させる方法はありますでしょうか?File::Find::Ruleなどがネット上にあったので使おうと努力しましたができませんでした.どなたかよろしくお願いします. (1)  2020 01 01 00 109.18970 18.36816 -2.317 -2.459 292.712 0.013 91.276 30.618 292.712 0.013 -2.317 -2.459 998.793 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2020 01 01 00 109.54297 18.39178 -2.702 -2.652 292.653 0.013 90.044 30.676  292.653 0.013 -2.702 -2.652 993.902 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ・ ・ ・ ・ (2) use warnings; open INFILE, '<', '2020-01-01_00.txt' or die "file open error: $!"; while( <INFILE> ){ chomp if( /\n$/ ); $Year = substr($_,0,4); chomp if( /\n$/ ); $Month = substr($_,5,2); chomp if( /\n$/ ); $Day = substr($_,8,2); chomp if( /\n$/ ); $Time = substr($_,11,2); chomp if( /\n$/ ); $Lon = substr($_,16,9); chomp if( /\n$/ ); $Lat = substr($_,29,8); chomp if( /\n$/ ); $Temp = substr($_,57,7); chomp if( /\n$/ ); $Hum = substr($_,76,6); chomp if( /\n$/ ); $Ozone = substr($_,85,6); chomp if( /\n$/ ); $Rad = substr($_,140,5); $data = $Year. "-".$Month."-".$Day." ".$Time." ".$Lon." ".$Lat." ".$Ozone." ".$Rad." ".$Hum." ".$Temp."\n"; open($data, ">", "data.txt") or die("error :$!"); } # ファイルを閉じる close INFILE; exit;  

  • perlでファイルのデータの一部を削除したい

    久しぶりにPerlを操作してファイルのデータの一部を削除したいのですが、削除出来ずに困っております。 3年以上触っていないため、過去のファイル等々を見ながらやってましたが、結果は出来ずじまいで停滞して困っております。 ご指導いただけないかと思い、書き込みしました。 ファイル名 $tmpfile データ構成  no,名称 1<>フレーム 2<>レンズ 3<>カメラ 4<>ファインダー 5<>めがね 6<>ズーム これで「めがね」を削除したいのです。 データnoで削除したいと思っておりますが、うまく動作しません。 以下ソース open(DB,"$tmpfile") || &error("Open Error : $tmpfile"); flock(DB, 1); @lines = <DB>; @new=(); foreach $line (@lines) { $flag=0; ($no,$meisyo) = split("<>", $line); foreach $x (@DEL) { if ("$x" eq $tmpnum) { $flag=1; last; } } if ($flag == 0) { push(@new,$line); } } open(OUT,">$tmpfile") || &error("Write Error : $tmpfile"); print OUT @new; close(OUT); ここまで 上のソースですと、エラーこそならずに(そうみえているだけかもしれません)終わりますが、データ削除が正しく出来ませんでした。 説明不足があるかもしれませんので、指摘いただけますと幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 該当項目表示について

    csvデータの列に%で区切った項目があります。 例) 1行目:aaa%bbb%ccc 2行目:aaa&bbb%ddd 3行目:aaa%bbb 3番目の項目(上記例ではccc、ddd)を 1、2番目の項目に該当させるには以下のスクリプトをどのように 変更すればよろしいのでしょうか? いろいろ調査や変更実行してみましたがうまく動きません。 $find = 0; for($d = 0 ; $d < @TEST ; ++$d) { chomp $TEST[$d]; (@ITEM) = split(/\,/, $TEST[$d]); @T = split(/\%/, @ITEMD[2]); #csvデータ内項目%区切り if($in{'item'} eq @T[0]) { if(($in{'item2'} eq "") or ($in{'item2'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item2'} eq @T[1]) { @FIND[$find] = $TEST[$d]; $find++; } } } 上記スクリプトに3番目も含める為にはどのようにすればよいのでしょうか? ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • 該当項目表示についての追加質問

    csvデータの列に%で区切った項目があります。 例) 1行目:aaa%bbb%ccc 2行目:aaa&bbb%ddd 3行目:aaa%bbb csvデータ内にはaaaは3個だけですが下記コードで実行すると aaaが6個と計算されます。bbb、ccc、dddの個数は正確に計算されます。 $find = 0; for($d = 0 ; $d < @TEST ; ++$d) { (@ITEM) = split(/\,/, $TEST[$d]); @T = split(/\%/, @ITEMD[2]); #csvデータ内項目%区切り if($in{'item'} eq @T[0]) #@T[0]にaaaが入ります { if(($in{'item2'} eq "") or ($in{'item2'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item2'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++; } if($in{'item2'} eq @T[1]) { if(($in{'item3'} eq "") or ($in{'item3'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item3'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++;     }    }   } } ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • チェックボックスのデータをdatファイルに保存する方法

    更新記録CGI(perl)を改造中です。 修正画面でチェックボックスにチェックを入れておくと確認画面である文字列を表示させるというのを実現させたいです。 表示させる方はIF文で、 if ($check ==1){普通に表示}else {別の文字列を表示} とすることで何とかなると思うのですが、このチェックボックスの情報の保存方法がよくわかりません。 記事登録処理の部分、 foreach (@data) { ($contents,$date,$year,$month,$day,$comment,$check) = split(/<>/); if ($in{'contents'} eq $contents && $in{'year'} eq $year && $in{'mon'} eq $month && $in{'day'} eq $day && $in{'comment'} eq $comment $in{'check'} eq $check ) { &error("記録済みです"); } } このあたりが、データの保存を指示している場所だと思うのですが、このままだと、datファイルには「in{'check'}」と保存されてしまいます。 これをどうやったらチェックボックスにチェックが入っているという風に保存できるのでしょうか? また、修正画面でチェックボックスにチェックが入っている場合はチェックが入った状態で表示する(その情報表示する)という風にしたいのですが、これまたうまくできません。 多分、 if ($no eq $in{'edit_no'}){~~$e_check = $check;~~} <input type=\"checkbox\" name=\"e_check\" size=5 value=\"$e_check \">\n"; この二つが関係していると思うのですが… 単純に、チェックボックスにチェックを入れて保存したら、datファイルにそのデータが保存され、チェックが入っていれば、修正画面・表示画面にてそれぞれのアクションを起こしてほしいというものです。 抜けてる情報などありましたら指摘してください。すぐに書き込みします。 よろしくお願いします。

    • 締切済み
    • CGI
  • cgiのif文で行を指定。

    ログファイルから任意の行を取り出すために、フォームで行を指定(入力)後、送信ボタンを押すと 表示させるようにしました。 if文はこんな感じです。 if ($NO == ''){ print &all; } else{ print &no; } 1より大きい時と、何も入力しないときはきちんと希望したものが表示されるのですが、 問題は0を入れたとき(ログファイルの1行目を出したい時)に、何も入力されてないと 認識されてしまうのです。 どうしたらよいでしょうか? ※$NOの後の==をeqに変えると何も入っていなくても0と認識されてしまいます。

    • 締切済み
    • CGI
  • 削除ボタンを押すとperlにてデータを削除するようにしたいんですができません。

    フォーム.html(一部) <form name="form1" method="post" action="admin.cgi"> <input type="hidden" name="mode" value="edit3"> <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><b>クライアント(ロードサイド)</b> <input type="hidden" name="group" value="1"> <br> ※前のページへ戻る場合には、ブラウザの戻るボタンでお戻りください。</td> </tr> </table> <br> <table width="740" border="1" cellspacing="0" cellpadding="10" align="center" bordercolor="#333333"> <tr> <td bgcolor="#FFEEEE">このデータを削除する場合には、下の削除ボタンをクリックしてください。<br> ※この作業は取り消しができませんので、よく確認してから削除ボタンをクリックしてください。<br> <br> <input type="button" value="物件NO: _%data_num%_ を削除する" onClick="location.href='admin.cgi?mode=del&group=_%group%_&data_num=_%data_num%_'"> <br> この「物件NO: 」のボタンを押すとadmin.cgiに飛び データファイル内のデータを空にします。 ----------------admin.cgi---------------------------------- if($param{'mode'} eq 'del'){ ##===================================== ## 物件データをオープン = ##===================================== if($param{'group'} eq '1'){ $datafile = $datafile1;} elsif($param{'group'} eq '2'){ $datafile = $datafile2;} elsif($param{'group'} eq '3'){ $datafile = $datafile3;} if(!stdio::lock($lock)){ error('システムエラー','只今混み合っております.'); } # ロック if(!open(DATA,"+<$datafile")){ stdio::unlock($lock); &error('システムエラー',"ファイル ( $datafile ) をオープンできませんでした。"); } @data = <DATA>; foreach(@data){ @data2 = split(/,/); if($data2[0] eq $param{'data_num'}){ $_ = ''; last; } elsif($data2[0] eq $param{'data_num2'}){ $_ = ''; last; } } seek(DATA,0,0); print DATA @data; truncate(DATA,tell(DATA)); close(DATA); stdio::unlock($lock); ##===================================== ## テンプレートオープン = ##===================================== if(!open(HTML,$html_finish)){ &error('システムエラー',"ファイル ( $html_finish ) をオープンできません。"); } @html = <HTML>; close(HTML); ##===================================== ## HTML出力 = ##===================================== print <<"EOF"; Content-type: text/html @html EOF exit; } # モード del ここまで ----------------------------------------------------- この「data_num2」の削除には成功するんですが 「data_num」の場合はボタンを押しても何も起こりません。 恐らく「data_num」のif文に行っていないのだと思うんですが、 何が原因か分かりません。 情報が少ないかもしれませんが 解決の糸口をお願いします。 データはcsv形式のファイルです。

    • ベストアンサー
    • HTML
  • リストに何も無ければXXを表示…

    あるCGIのログの一部をSSIで表示させようとしています。リストの「pt」と「name」があったものだけを「$max」個表示すると言う物です。 一部抜き出すと… ----- print "Content-Type: text/plain\n\n"; open (FILE,"../../cgi-bin/navi-a/navi.log"); $i=0; while (<FILE>) { local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($pt eq $ARGV[0] && $name eq $ARGV[1]){ $i++; print "~ } if ($i >= $max) { last; } } ----- これに、「合う物が無かったら"無いですよ"文を表示」と言うのを付けたいのですが、うまく出来ません。 if ($pt eq $ARGV[0] && $name eq "") とかを試してみましたがうまく出来ませんでした。 何か良い方法が無いでしょうか? お願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう