こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl ブログ等の記事の編集

記事の編集について教えてください。
ブログ等の記事を書き込むまではできました。

そこで、書き込んだ後に、記事を編集・修正をしたいと思い
ソースを考えているのですが、
わからなくなりました。
お力添えをお願い致します。

#log.txt
1,test1,name1,text1
2,test2,name2,text2
3,test3,name3,text3
4,test4,name4,text4
5,test5,name5,text5


open(FILE, "<$FILE") or die("error :$!");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
#記事表示
for ($i=0;$i<5;$i++){
last if ($i > @DATA);
$data = $DATA[$i];
if ($data ne ""){
my ($category,$title,$name,$text) = split(/,/, $data);
print qq(<input type="radio" name="no" value="%02d">$category - $title - $name - $text\n), $i;
print qq(<input type="submit" name="edit" value="編集">\n);
print qq(<input type="submit" name="delete" value="削除">\n);
}
}

そこで、radioボタンを選択し、
submit「編集」をクリックすると
radioボタンで選択されている行のデータを取り出し
修正をするということをしたいのですが、どのようにすればいいでしょうか?

今回の求めている結果ですと
log.txtの3行目を取り出し

3,test3,name3,text3

3,hen3,kou3,henkou3

にして

最終的なlog.txtは
1,test1,name1,text1
2,test2,name2,text2
3,hen3,kou3,henkou3
4,test4,name4,text4
5,test5,name5,text5

というふうにしたいです。

よろしくお願いいたします。

投稿日時 - 2017-03-16 13:55:12

QNo.9305759

困ってます

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

いつものクセで、先の回答で $_ を使ってしまいました。
$_ のところは $data に置き換えてください。

投稿日時 - 2017-03-24 23:03:08

お礼

ありがとうございました。

またわからないことがありましたら、よろしくお願いいたします。

投稿日時 - 2017-03-27 12:19:42

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

削除・編集は次のようにやれば出来るはずです。
※動作確認をせず、頭の中で組んだスクリプトですので、間違っている場合はご容赦を

【削除】
foreach $data (@DATA) {
($category,$title,$name,$text) = split(/,/, $data);
if ($category == $no) { next; }
else { push(@newArray,$_); }
}

【編集】
foreach $data (@DATA) {
($category,$title,$name,$text) = split(/,/, $data);
if ($category == $no) {
push(@newArray,"$no,$revTitle,$revName,$revText\n"):
# 編集後の値を$revXXXXとしています。ここは自由に使い分けてください。
}
else { push(@newArray,$_); }
}

あとは@newArrayを元のファイルに戻してやればOKです。
※ $no がフォームから渡ってきた削除対象の番号です。

投稿日時 - 2017-03-24 22:59:46

お礼

ありがとうございました。

編集及び削除することができました。

投稿日時 - 2017-03-27 12:19:13

ANo.1

カテゴリー値(log.txtの一番左のフィールド)が一意の値であるのなら、次の手法でいけます。
なお、編集/削除ボタンは一組あれば十分です。
※テキストベースのファイルを編集するには、一意の値をもつフィールドを用意したほうがやりやすいです。

#/usr/bin/perl

use CGI;

$myscript = 'test.cgi';
$FILE = 'log.txt';

$query = new CGI;

$no = $query->param('no');
$mode = $query->param('mode');

if ($mode eq "編集") { &editForm; }
elsif ($mode eq "削除") { &delForm; }
else { &init; }

sub init {
open(FILE, "<$FILE") or die("error :$!");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;

print "<form action=\"$myscript\" method=\"POST\">\n";
for ($i=0;$i<5;$i++){
last if ($i > @DATA);
$data = $DATA[$i];
if ($data ne ""){
my ($category,$title,$name,$text) = split(/,/, $data);
print qq(<input type="radio" name="no" value="$category">$category - $title - $name - $text<br />\n);
}
}
if ($i > 0) {
print qq(<input type="submit" name="mode" value="編集">\n);
print qq(<input type="submit" name="mode" value="削除">\n);
}
print "</form>\n";
}

#編集フォーム
sub editForm {
}

#削除確認フォーム
sub delForm {
}

これでラジオボタン「no」の値にカテゴリー値が入り、編集(または削除)フォームに渡すことが出来ます。
※値渡しをするときはCGI.pm を使ったほうが圧倒的に楽です。

編集(または削除)フォーム内で、該当のカテゴリー値のレコードのみを抜き出すには、次のようにします。

open(FILE, "<$FILE") or die("error :$!");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;

foreach (@DATA) {
($category,$title,$name,$text) = split(/,/, $_);
if ($category == $no) { last; }
}

これで $category,$title,$name,$text が、先のフォームのラジオボタンで選択した値のみ抽出されます。

投稿日時 - 2017-03-18 00:21:11

補足

コメントありがとうございます!

投稿日時 - 2017-03-21 13:44:40

お礼

radioタイプ選択後、ボタンをクリックし、値を抽出するとこまで
ご掲示して頂いたソースで実行確認できました。

しかしこの先の編集、削除する場合
どのような処理をするのでしょうか?

削除は「splice」・・・?
編集は「unshift」・・・?

現在、削除はspliceでradioタイプのNoを抽出し
splice @DATA, $NO, 1;
このような感じで削除させているのですが、これは同じ要領なのでしょうか?

編集は、抽出した値を
<input type="text" name="各名前" value="受け取った値">
のようにして一度textに放り込んでから、
それを変更する形になるのでしょうか・・・?

投稿日時 - 2017-03-21 13:44:35

あなたにオススメの質問