一回も披露したことのない豆知識

たびたびお世話になります。

データには、「データNO」「登録NO」「名前」「カテゴリー」「金額」が登録されています。
もともとあったデータをフォームで編集、送信してデータNO($d_no)と一致した行だけを書替え(上書き)したいんですが、どうしても方法がわかりません。

open(IN,"../save_data/sdeta.txt");
@data = <IN>;
close(IN);

foreach(@data){
chop($sdata);
($d_no,$s_no,$s_name,$d_class,$s_price) = split (/=/, $sdata);
if( $value eq $d_no){
$sdata="$in{'d_no'}=$in{'s_no'}=$in{'s_name'}=$in{'d_class'}=$in{'s_price'}\n";
}else{
$sdata="$d_no=$s_no=$s_name=$d_class=$s_price\n"
}
}

open(OUT,">../save_data/sdeta.txt") || &error("オープンエラー");
print OUT @data;
close(OUT);


上のプログラムを書いても、書替えできませんでした。
どのように直せば一行のみの書替えが出来るんでしょうか。

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

A 回答 (3件)

まず、お約束として、スクリプトの最初の方に


use strict ;
use warnings ;
を書きましょう。こうすると、宣言してない変数とか、未定義値を文字や数値として利用したりするなど、通常はそのまま使えることが、エラーにや警告になります。

で、おそらく、$sdataについてエラーまたは警告が出るはずです。提示された範囲で$sdataに値が設定されているのは
> $sdata="$in{'d_no'}=$in{'s_no'}=$in{'s_name'}=$in{'d_class'}=$in{'s_price'}\n";
> $sdata="$d_no=$s_no=$s_name=$d_class=$s_price\n"
この2行だけです。
> ($d_no,$s_no,$s_name,$d_class,$s_price) = split (/=/, $sdata);
では、最初の$sdataは無いので前の変数は全部空だし、2回目以降は先の2行のどちらかの内容が繰り返されるだけです。


初心者とのことですが、それならなおさら基礎を勉強してください。
ネットのサンプルコードを参考にするにも、どこが必要か見極められなければ意味がありません。
    • good
    • 0
この回答へのお礼

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

use strict ;
use warnings ;

をスプリクトの最初の方につけたら、言われたとおりエラーが出ました。

今回質問した箇所を削除して転送してもエラーが出たので、
他にも色々な箇所が間違っていたようです・・・。

kmeeさんの言われたように、もう一度基礎から勉強してみようと思います。
どうもありがとうございました。

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

「$sdataは「$d_no,$s_no,$s_name,$d_class,$s_price」をまとめたものかな、と思っていたんですが。

」というのは, どうしてそう思われたのでしょうか? 少なくとも, このスクリプト中で $sdata に値を設定する前に chop とか split とかしてますよね.

foreach のデフォルトの変数はなんでしょうか?
    • good
    • 0
この回答へのお礼

色々とエラーが見つかったので、もう一度基礎から勉強してみます。

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

お礼日時:2011/08/23 08:55

そりゃそうでしょう. $sdata ってなに?

この回答への補足

この$sdataがそもそも必要ないんでしょうか?
$sdataは「$d_no,$s_no,$s_name,$d_class,$s_price」をまとめたものかな、と思っていたんですが。

色々なサイトを参照しながら作成しているんですが、
perl初心者なので、全てが理解しているわけではありません。
すみません。

どのように直したら、変更していない行はそのままで、
一行だけ上書き保存が出来るんでしょうか。

少しいじると編集した1行だけ残して、あとのデータは全て消えてしまったりします。

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

補足日時:2011/08/22 16:30
    • good
    • 0

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