• 締切済み

配列を変更しファイルに書き込むとなぜか古い配列も・・・

OKWebAdminの回答

回答No.1

管理者より: 同等の質問があるのでそちらをご参照下さい

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=219929

関連するQ&A

  • Perlでファイル書き込みの際の不思議

    WEB上でPerlCGIを稼働し、ファイル(file.dat)からデータを読み込み、 @line=(0001,0002,0003) とします。 このときファイルの中身は 0001 0002 0003 という風に改行されています。 そして、@lineをいろいろ操作し、最終的に @newline=(0001,0003) とし、 (実際には各要素には改行がついています) これを open(OUT,">file.dat") print OUT @newline; close (OUT); と言う風に書き込み処理しました。 すると、ファイルの中身はなぜか 0001 0003 0001 0002 0003 もしくは 0001 0003 00001 0001 0002 0003 となってしまいます。(この違いはいろいろ試しているうちに発生しました) もちろん上書きオープンです。 試しに @newline を空にして書き込むとファイルは空になりました。 どう試してみても、新しいデータと古いデータが書き込まれてしまうのです。 場合によっては心当たりの無いデータまで・・・ 書き込みの前後で@newlineを画面表示してみましたが、 書き込みの前も後も問題なく表示されています。 つまり、書き込まれたデータだけが異常なのです。 今まで、データの更新→書き込み というのを いろいろやってきましたが、このような現象は初めてです。 原因として考えられることを教えてください。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 連想配列(ハッシュ)のファイルへの書き込み方

    連想配列(ハッシュ)のファイルへの書き込み方と、 そのファイルからの読み込み方で困っています。 たとえば以下のような連想配列(ハッシュ)があって %colorFile = ( 'red'=>'5', 'green'=>'10', 'blue'=>'3' ); この情報をサーバーの color.dat ファイルに書き込んで保存し、 変更があったときにファイルからデータを読み込むには どのようにしたらいいのでしょうか? 連想配列(ハッシュ)のまま保存すると color.datの中身が green10blue3red5 のようになってしまい、 読み込んだときに連想配列(ハッシュ)に復元できません…。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 配列の一部を書き換えてファイルに保存する方法は?

    $dicname ='GermJ.txt'; open(IN, "$dicname"); @list = <IN>; close(IN); 読み込んだ配列@listの5番目のデータを'aaaaaaaaaa'に書き換えたいのですが、 $list[5]='aaaaaaaaaaaaaaaaa'; open(OUT, "> $dicname"); foreach (@list) { print OUT $_; } close(OUT); とやって、ファイルの中身を調べると、6番目の文字列データが5番目の文字列データの後ろにくっついてしまっています。 改行マークを $list[5]='aaaaaaaaaaaaaaaaa',\n;のように行末に追加しても、次の行とのあいだに空間が生まれます。基本的なファイル書き込みの知識をお尋ねして申し訳ありませんが,どうかお教えください。

    • ベストアンサー
    • Perl
  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • ファイルからデータを読み込んで、配列に格納する方法

    データファイル grep.dat があり、その中は 12345 67890 ABCDE (EOF) となっています。   このファイルの中身を読み込んで、配列 P[0]の 中に("12345","67890","ABCDE") に格納したい のですが、どのように記述すればよいでしょうか。

    • ベストアンサー
    • Perl
  • 配列のデータから改行だけを取り除いて上書きしたい

    いつもお世話になっています。 CGIで現在下記のようなファイルがあります。 【sample.cgi】 1<>2<>3<>4<>5<> 6<>7<> これを下記のスクリプトで呼び出し配列に入れます。open(IN,"./sample.cgi"); @DATA = <IN>; close(IN); @data = split(/<>/,$DATA[0]); @N_DATA=(); unshift(@N_DATA,"$data[1]<>$data[2]<>$data[3]<>$data[4]<>$data[5]<>$data[6]<>$data[7]<>"); open(OUT,">./sample.cgi") or &error('書き込み失敗'); print OUT @N_DATA; close(OUT); しかし実行結果は改行が残ったままで、どうにか 1<>2<>3<>4<>5<>6<>7<> という形で出力したいのですがどのように変更を行えば宜しいでしょうか。 恐らく「unshift」の部分が行を追加していっていると思うのですが、printなどで出力するとsample.cgiの中身が空になってしまい・・・。 「読み込むデータに改行があった場合は改行を削除して読み込む」という動作をさせたいのですが・・・。 何卒よろしくお願い致します。

    • ベストアンサー
    • CGI
  • 配列の添削願

    $dataという変数から配列を取り出すとき もしも中身が空なら0を代入したいです。 $a = $data[$i]; //$data内の$iのデータを取り出す if($a==""){ $a=0; }//$iが空もしくは存在しない場合0を追加 echo $a; こちらの文章で$aの中には文字列もしくは 存在しないかデータが空の際は0が表示されるでしょうか? 今、配列の中身が空や\nのとき0を入れたいがうまくいかず困っています。

    • ベストアンサー
    • PHP
  • ファイルから読み込んで配列へ

    PerlでCGIスクリプト(掲示板もどき)を作成しています。 配列の操作がうまくいかず、ご教授頂きたいと思います。 <やりたい事> 1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。 2.そのテキストの一部を使ってHTMLで表を作る。 <実際の作業> 1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。 &ReadParse; #フォームからデータを受け取る $o=$in{'name'}; $p=$in{'mail'}; $q=$in{'title'}; $r=$in{'comment'}; open(IN,"xxx.txt"); @tmp1=<IN>; close(IN); #1件1行として新規データを追加する unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n"); open(OUT,">xxx.txt"); print OUT @tmp1; close(OUT); 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。 データを読み込む時点でつまづき、先に進めません。 <テキストファイルの例> 1行目:a,b,c,d 2行目:e,f,g,h 3行目:i,j,k,l 以下同様 <症状> print @tmp1;とすると、a~lの全てのデータが表示される。 $tmp1[0];とすると、(a)のみ表示される。 $tmp1[1];とすると、カンマ(,)が表示される。 $tmp1[2];とすると、(b)が表示される。 <質問> 一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。 気分的には↓こんな感じです。 foreach { "行の処理" foreach { "列の処理" } } そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。 宜しくお願いします。 なお、不足している情報がありましたら補足いたします。

    • ベストアンサー
    • Perl
  • perlです。配列ファイルをよみこんで、1つの要素を上書きする方法

    配列のファイルがあり、それをよみこんで、1つの要素だけ上書きして保存する方法を教えてください。 ex. file.datを以下のようなファイルだとして・・・ あいうえを かきくけこ さしすせそ たちつてと file.datが、 さしすせそ となるようにしたいのです。(つまり、三番目の要素を取り出し、上書き保存するというもの) 以下のように書いてみましたがうまく動きません。 open()やclose()は一回使うだけでいいように、読み書き両用で開いてみました。 $_にはファイル名が入っています。 open(FILE,"+<$_"); @temp=<FILE>; $temp2=$temp[2]; print FILE $temp2; close(LOGFILE); +<を+>とすると、ファイルが空(何も無くなる)となります。 まず読み専用で開いて、ファイルを閉じた後。上書き用で開いたほうがいいのでしょうか??

    • ベストアンサー
    • CGI
  • 配列をファイルに書き込む方法

    下記($dataに入ってる)配列をファイルに書き込みたいのですが、書き込み方法が分かりません、教えていただけませんでしょうか・・・。 $dataの中身は Array ( [0] => あいうえお [1] => かきくけこ [2] => さしすせそ [3] => たちつてと ) これを $fp=fopen("1.txt","w"); fputs($fp,$data); fclose($fp); にするとArrayとだけ表示されます。 あいうえお\n かきくけこ\n さしすせそ\n たちつてと\n と書き込みたいのですが・・・、お願いします。

    • ベストアンサー
    • PHP