• ベストアンサー

ファイルの配列のリストデータ(変数)の特定の変数の値だけを変えたい。

サブルーチンの下のコードで表題の事をやろうとしていますが、 1)値が変わりません。($sinkou) 2)「エラー2','メッセージファイルが開けませんでした.」と表示されてしまいます。 3)モジュールで実現する方法がアったら教えてください。 よろしくお願いします。 sub SET_sinkou{ my($number,$name,$sinkou,@new,$line,$hanabi,$sinkou2); $lockfile = "$tmp_dir$cmd{'log'}\.lock"; &lock; if (!open(DB,$message_file)) { &Error('エラー1','メッセージファイルが開けませんでした.'); } while(<DB>){ ($number,$name,$sinkou) = split(/\t/,$_,3); if($number == $_[0] ) { $sinkou = $_[1]; $sinkou2 = $_[1]; #チェック用 $hanabi='花火'; #チェック用 $line=join(' ',$number,$name,$sinkou); push @new,$line; } else{ $line=join(' ',$number,$name,$sinkou); push @new,$line; } } close DB; if (!open(DB,">$message_file")) { &Error('エラー2','メッセージファイルが開けませんでした.'); } foreach(@new){ print DB $_; } close(DB); unlink($lockfile); &Html_head; print <<"EOF"; $body <h2><strong>変更しました。$sinkou=$sinkou=2=$_[0]=$_[1]=$hanabi</strong></h2><p> <!--$sinkou=$sinkou=2=$_[0]=$_[1]=$hanabiは値のチェック用--> </body></html> EOF }

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.2

勝手に書き換えさせていただきました。(ぇ) sub SET_sinkou{ my(@input) = @_; my($number,$name,$sinkou,@new); $lockfile = "$tmp_dir$cmd{'log'}\.lock"; &lock; open(DB,"+< $message_file") || &Error('エラー1','メッセージファイルが開けませんでした.'); @LST = <DB>; foreach (@LST) { chomp; ($number,$name,$sinkou) = split(/\t/); if($number == $input[0]){$sinkou = $input[1];} push(@new,join("\t",$number,$name,$sinkou)."\n"); } truncate(DB,0); seek(DB,0,0); print DB @new; close(DB); unlink($lockfile); &Html_head; print <<"EOF"; $body <h2><strong>変更しました。</strong></h2><p> </body></html> EOF }

ctpsys
質問者

補足

Etherskyさん 御返事ありがとうございます。 きれいなプログラミングで、早くこのように書けるようになりたいです。 早速、確認させていただきました。 他のところで問題があるのか、 「エラー1','メッセージファイルが開けませんでした.」 と、表示されてしまいました。 再度、お教えいただければ幸いです。 よろしくお願いいたします。

その他の回答 (2)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.3

「メッセージファイルが開けませんでした」となってしまう原因は、ファイルがなかったりパーミッション上ファイルに書き込みまたは読み込みができないのが原因であると思われます。 ちゃんと変数「$message_file」にはファイル名が代入されているのでしょうか? ちなみにエラーの原因が知りたければ、 &Error('エラー1','メッセージファイルが開けませんでした.'); の部分を &Error('エラー1',"メッセージファイルが開けませんでした. 原因:$!"); に書き換えることで特殊変数$!にPerl側からのエラーの内容がメッセージとして代入されます。 (注意:「'」は「"」に変えてください。でないと文字として$!がそのまま表示されてしまいます)

ctpsys
質問者

お礼

Ethersky さん  ありがとうございました。 パーミッションが間違っていました。 おかげさまで成功しました。

  • rara_sun
  • ベストアンサー率50% (271/539)
回答No.1

Perl って何?って感じの私なのですが・・。 myって、有効範囲があるようです。 http://www.graco.c.u-tokyo.ac.jp/~nishi/programming/perl/my.html $sinkou を my にしないか、配列を返り値(できるのかもわからないです・・)にすればよいのではないでしょうか? 的を外れていたらご容赦を・・。

ctpsys
質問者

補足

rara_sunさん 御返事ありがとうございます。 myとlocalの違いもよくわからない私です。 今回、myの指定範囲が不安なところもありました。 参考のURLありがとうございます。 御指摘のところを、もう一度チェックしてみます。

専門家に質問してみよう