perl初心者です。
説明不足の箇所もあるかと思いますが、よろしくお願いします。
テキストデータから指定した1行を抜き出して表示するのにはどうしたらいいんでしょうか。
data.txtの中に=で区切られた文字が入っているとします。
1=にんじん=150
2=じゃがいも=200
3=たまねぎ=100
左から$s_no,$s_name,$s_priceという変数になっています。
これを
print <<"EOF";
<TABLE class="list_index">
EOF
open(IN,"../indata/sdeta.txt");
@data = <IN>;
close(IN);
foreach $sdata (@data){
chop($sdata);
($s_no,$s_name,$s_price) = split (/=/, $sdata);
print <<"EOF";
<TR>
<TD class="list2">$s_no</TD>
<TD class="list3">$s_name</TD>
<TD class="list4">$s_price円</TD>
<TR>
EOF
}
print <<"EOF";
</TABLE>
EOF
という感じでテーブルにデータを全て一覧表示させました。
ここから、$s_noで表示されている「1」「2」「3」をクリックすると、
別ページにとんで、クリックした番号の1行を編集用のフォームに表示させたいです。
フォームに表示させる方法はわかっているんですが、
クリックで指定した1行だけを表示する方法がわからずに困っています。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
>フォームに表示させる方法はわかっているんですが、
>クリックで指定した1行だけを表示する方法がわからずに困っています。
「1」「2」「3」をリンクにするならGETで、送信ボタンにするならPOSTでデータをリンク先のCGIなどに送ればいいんじゃないかな。
GETで送るなら、
↓ここを
<TD class="list2">$s_no</TD>
↓こんな感じに変えて、(form.cgiは送り先)
<TD class="list2"><a href="./form.cgi?no=$s_no&name=$s_name&price=$s_price">$s_no</a></TD>
from.cgiで、
my @getdata = split(/'&'/, $ENV{QUERY_STRINGS});
foreach my $s ( @getdata ) {
my @arrdata = split(/'='/, $s);
$h{$arrdata[0]} = $arrdata[1];
}
my $value = join('=', $h{'no'},$h{'name'},$h{'price'},);
print "<input type=\"text\" value=\"$value\">\n";
とかで出来ないでしょうか。
※確認してません。あくまでもヒントなのでコピペでエラーがでたら修正してください。
POSTだと、リンクではなくて"送信ボタン"になると思うので、form.cgi 内の
$ENV{QUERY_STRINGS}
が使えません。
POSTの場合はstdoutを拾う必要があります。(CGI.pmを使うと楽ちんです。)
てか、その一行って、$sdata そのものでしょうから、そもそも$s_XXXXに小分けして送信する必要ないかもしれませんが。。。
No.4
- 回答日時:
#3です。
>それぞれ$s_noで番号がふってあるので、
>てっきりform.cgi側でsdeta.txtを読み込んでから、
>クリックした番号$s_noで呼び出す(検索する?)感じで、
>if文かなにかを使って特定の1行を表示させるのかな・・・と思っていたので。
それだと、list表示するためにファイルopen、form表示するためにファイルopen、変更データを書き込むためにファイルopenと、合計3回ファイルをopenすることになります。
対象の一行は、list.cgiで読み込んで変数に格納済みですよね?
フォームを表示するために、form.cgiへ飛んでからもう一度ファイルをopenして読みなおすのは無駄なロジックだと思いませんか?
ファイルの容量とアクセス規模にもよると思いますが、flockも馬鹿にならないので個人的には何度もファイルをopenするのは好きではありません。
[list.cgi]
(1)ファイルを読み込み、それぞれの値を変数化して一覧表示。
(2)リンクをクリックしてform.cgiにそれぞれの変数を送信。(リンク形式ならGETかな?と思いました。)
[form.cgi]
(1)list.cgiから送られてきたデータを、内部で再度変数化。
(2)(1)整形してをフォームに表示する。
(3)”送信”ボタン(<input type="submit">)で、サブルーチンなり別のcgiなりにデータを送ってファイルに書き込む。(ここではPOSTの方が便利)
とやればファイルopenが1回減るかな、と思います。
>また、フォームの内容を書き換えて上書き保存をする場合、
>そのまま「上書き保存」の送信ボタンを押せば
>表示された行だけ書き換えることができるんでしょうか。
ここは、何行目という特定が出来ないのであれば、
open(IN,"../indata/sdeta.txt") || die "$!";
flock(IN, 1);
@data = <IN>;
close(IN);
とやるしかないので、@dataの要素をそれぞれsplitしながらifでの振り分けが必要になると思います。
回答ありがとうございました。
いちいちファイルopenはしなくても大丈夫なんですね。
まだちょっと完全に理解は出来ていないんですが、
色々なやり方があって、perlは難しいな~と痛感しているところです。
新しく別の仕事が入ってきたので、しばらくcgiのほうは手がつけられそうにないんですが、
koba0626さんから教えてもらった方法でやってみたいと思います。
本当に色々ありがとうございました!
NO.2の回答にベストアンサーをつけさせてもらいますね。
No.3
- 回答日時:
自己レス。
^^;;>my $value = join('=', $h{'no'},$h{'name'},$h{'price'},);
カンマ多すぎ。
my $value = join('=', $h{'no'},$h{'name'},$h{'price'});
>from.cgiで、
form.cgiね。
>POSTだと、リンクではなくて"送信ボタン"になると思うので、form.cgi 内の
>$ENV{QUERY_STRINGS}
>が使えません。
わかり辛い表現になりました。
送信ボタンに関係なく、POSTだと$ENV{QUERY_STRINGS}では拾えません。
この回答への補足
色々教えていただいてありがとうございます。
教えてもらったものがうまく作動しないので、今修正しているところです。
その上で質問で申し訳ないんですが、
教えてもらった方法は、リスト一覧で表示された1行を読み取り(?)GETを使ってform.cgiに送るということでしょうか。
この場合、form.cgi側ではsdeta.txtのファイルデータを開かなくても大丈夫なんでしょうか。
毎回補足で申し訳ないんですが、やりたいことは、
sdeta.txtを読み込みlist.cgiでデータ一覧を表示する。
1 にんじん 150
2 じゃがいも 200
3 たまねぎ 100
この「にんじん・じゃがいも」などの名称と「150・200」の金額を編集したいので、
編集したい行の番号をクリックすると、form.cgiにジャンプして、
番号をクリックした1行を名称・金額のそれぞれのフォームに表示させる。
表示されたものを書換え、sdeta.txtに上書き保存。
ということがしたいんです。
それぞれ$s_noで番号がふってあるので、
てっきりform.cgi側でsdeta.txtを読み込んでから、
クリックした番号$s_noで呼び出す(検索する?)感じで、
if文かなにかを使って特定の1行を表示させるのかな・・・と思っていたので。
また、フォームの内容を書き換えて上書き保存をする場合、
そのまま「上書き保存」の送信ボタンを押せば
表示された行だけ書き換えることができるんでしょうか。
本当に初心者で色々とすみません・・・。
会社でcgiを作成していて、色々なHPを参考にちょっとずつ出来上がってはいるんですが、
この「特定の1行」を表示する方法がどうしてもわからないんです(泣)
よろしくお願い致します。
No.1
- 回答日時:
正確にどこがわからんのかがわからんのだけど, ハッシュ (か配列) に突っ込んじゃえばデータはとってこれるよね.
この回答への補足
説明がわかりずらくてすみません。
そのデータのとってきかたがわからなくて困っています。
複数の行があって、最初から「3行目を取り出したい」とかわかっているなら処理はなんとなくわかるんですが、
そのつどクリックした特定の行をどのように表示するのかがわからないんです。
表示する側のcgiでtxtファイルを開く・・・までもちろんはわかるんですが、
open(IN,"../indata/sdeta.txt");
@data = <IN>;
close(IN);
この後の処理がわかりません。
$s_noに入っている数字を検索して表示するんでしょうか?
ここ数日、本当にわからなくて頭を抱えています。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- HTML・CSS 【CSS】:hasで可能? imgを含むtr要素を選択したい 1 2022/11/17 14:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
拡張子 ”log” と ” dat” の違い
-
ADOによるCSVファイルからのデ...
-
C言語でのファイルのデータ更...
-
perlで容量の大きいCSVファイル...
-
画像をバイナリデータに変換す...
-
ReadLineでの読み出し行を指定する
-
fopen64について
-
一行だけ読込
-
perlを用いた特定文字列間の抽...
-
htaccessで特定のディレクトリ...
-
ファイル全てを .xlsm に変更し...
-
close()で例外が投げられる理由
-
Perlで フォルダ内の全て...
-
ディレクトリ名を取得したい
-
一定時間が経過したフォルダの削除
-
テキストファイルの結合
-
batファイルでrenameができませ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
Perlの変数に文字数制限(容量...
-
perlで、後ろの行を読んで、前...
-
2つのCSVファイルをマッチング
-
C言語でのファイルのデータ更...
-
VB6.0でDB接続する際に切断時の...
-
CSVが可変長の場合の検索方法
-
perlで容量の大きいCSVファイル...
-
1ファイルずつ読み込みたい
-
VBScriptでファイル保存先のデ...
-
C#でCSVファイルを逐一更新したい
-
perl で googleAPIを呼び出す...
おすすめ情報