アプリ版:「スタンプのみでお礼する」機能のリリースについて

#!/usr/bin/perl

require './jcode.pl';
$file = "houkoku.txt";

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

&jcode'convert(*value,'sjis');

$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$value =~ s/\t//g;
$value =~ s/\r\n/\n/g;
$value =~ s/\r/\n/g;
$value =~ s/^\s+//;
$value =~ s/\s+$//;

$FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value;
}
open( WRITE, "+< $file" );
print WRITE $FORM{'name'},",",$FORM{'color'}."\n";
close(WRITE);

foreach ( keys %FORM ) {
if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; }
}
#if ( $FORM{'name'} eq '' ) { $FORM{'name'} = '入力がありません'; }
if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; }

print "Content-Type: text/html\n\n";
print <<END_HTML;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<center>
<table border="1">
<td>
$FORM{'name'}</td>
<td>
$FORM{'color'}</td></tr>
</table>
</center>
</body>
</html>
END_HTML
exit;

として、カンマ仕切りでデータを保存できるようになりました。

これを、指定行への書き込みを行いたいのですが、どのようにしたら良いでしょうか。
たとえば、5行目にこのデータを書き込んで、常に5行目を上書き更新するような感じです。
よろしくお願いします。

A 回答 (7件)

ファイルというものは、原稿用紙のマス目にぎっちり文字を書くようなものだと思ってください。


途中を書き換える、というのは、消しゴムで消して書きなおすようなものです。
元と同じ文字数なら、消したところに書くだけですが、元より短かければその分が空いたままになるし、長ければマスが足りません。
ワープロやエディタのように空きを詰めたり、後へずらしたりしません。
自分で前や後へ書き写す必要があるのです。

この回答への補足

ありがとうございます。
そうですか。難しそうですね。
すると、例えば500人の顧客プロフィールの作成にあたり、
チェックボックスで毎回更新する為には、
500枚の書き込み用.txtファイルが必要ということでしょうか。

よろしくおねがいします。

補足日時:2011/09/27 20:40
    • good
    • 0

まずは、問題を分割しましょう。


今ある問題というのは
(1) フォームのチェックボックスに設定した内容を特定の文字列(カンマ区切り)にしたい
(2) (1)の文字列を目的のファイルの特定の箇所に挿入したい:例えば5行目を差し替えたい
(3)(1)→(2)というのがたくさんある。どうやって使いわけるのがいいか
.....
となるのではないでしょうか?

> チェックボックスが空欄な列は、記録されず、,2,4,6と、チェックの入った部分だけが記録されます。

というのは、(1)の問題では?
    • good
    • 0
この回答へのお礼

ありがとうございます。
if (column[0] eq 1 || column[1] eq 1 ・・・というかたちで、
カラムを全部設定して、1 があればcheckd という形にして、解決しました。

しかしビックリするほど長いプログラムになってしまいました。

お礼日時:2011/09/30 23:08

そうですね, 記録しておくファイルが「テキスト」でなくてもいいならデータベースという方針もありましたね>#4.



「空欄の部分に任意の文字を入れたい」というなら, それは「そのまま」プログラムにすればいい. 現状どんなふうにしていてどう困っているのかは知らんが.
    • good
    • 0

略さず書くと



open my $fh, "<", "file.txt" or die $!;
open my $out, ">", "output.txt";

while (<$fh>) {
if ($. == 5) {
print $out $what_do_you_wish_to_write_here;
} else {
print $out $_;
}
}

close $fh;
close $out;

ということで、#1の全部書き変える方法の事です。
チェックボックス云々はごめんなさい、理解できませんでした。
    • good
    • 0

このプログラムと「常に5行目」と「チェックボックスで更新」の関連がよくわからないんですが。



特定の顧客のデータを変更したい、5行目というのが「顧客番号5番(仮)」で常に5番とは限らない、というのなら、
全体を読み込み→該当行を変更→全部書き戻す(#1にあった方法)が常套手段だと思いますよ。
また、1人1ファイルというのも手段の一つです。

データベースを使うのも手ですし。

この回答への補足

申し訳ありません。
チェックボックスでの読み込みは不完全ながらできました。
しかし、上記のプログラムですと、チェックボックスが空欄な列は、記録されず、
,2,4,6と、チェックの入った部分だけが記録されます。
空欄の部分に任意の文字を入れたいのですが、どのようにしたら良いでしょうか。たとえば、空欄には0を、もしくは、空欄であれば""をといった感じです。

よろしくお願いします。

補足日時:2011/09/28 09:54
    • good
    • 0
この回答へのお礼

ありがとうございます。
全体を読み込み→該当行を変更→全部書き戻すを選択した時に、

チェックボックスにて読み込む作業をしたいのですが、
なかなかできません。

たとえば、50人の社員が各々30人の顧客を持っている場合、担当者分50枚のファイルを作成(中に30人の顧客データ)して読み書きをしたいのですが。
どのようにしたら良いでしょうか。ファイルをチェックボックスの形式で読み込んで、全部書き換える感じです。

よろしくお願いします。

お礼日時:2011/09/28 08:46

適当なファイルハンドル開いて、


print FH $str if $. == 5;

それより、スクリプトが10年以上前にはもう止めになった書き方なので、
 use CGI;
 my $q  = CGI->new;
 my $name = $q->escapeHTML( $q->param('name') );
とかにした方が。。。
ファイル上書きじゃなくて、Text::Xslateとかのテンプレートエンジン使って
更新したい部分に値を投げてやるのがイマドキかと思います。

この回答への補足

open( WRITE, "+< $file" );
print WRITE $str if $. == 5;
print WRITE $FORM{'name'},",",$FORM{'color1'}."\n";
close(WRITE);

ということでしょうか・・? 何かうまくいきません。

補足日時:2011/09/27 18:19
    • good
    • 0

行の長さが一定なら seek とか.


そうでなければあきらめて全部読み込んで必要なところを書き換え全部出力.

この回答への補足

行の長さは一定ではないんです。
空欄での送信でも カンマカンマで保存されます。
逆に空欄の場合0とか、任意の文字を入れるのは可能でしょうか

補足日時:2011/09/27 18:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!