• ベストアンサー

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

サブルーチンの下のコードで表題の事をやろうとしていますが、 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 }

  • Perl
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • 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ありがとうございます。 御指摘のところを、もう一度チェックしてみます。

関連するQ&A

  • perlでファイルのデータの一部を削除したい

    久しぶりにPerlを操作してファイルのデータの一部を削除したいのですが、削除出来ずに困っております。 3年以上触っていないため、過去のファイル等々を見ながらやってましたが、結果は出来ずじまいで停滞して困っております。 ご指導いただけないかと思い、書き込みしました。 ファイル名 $tmpfile データ構成  no,名称 1<>フレーム 2<>レンズ 3<>カメラ 4<>ファインダー 5<>めがね 6<>ズーム これで「めがね」を削除したいのです。 データnoで削除したいと思っておりますが、うまく動作しません。 以下ソース open(DB,"$tmpfile") || &error("Open Error : $tmpfile"); flock(DB, 1); @lines = <DB>; @new=(); foreach $line (@lines) { $flag=0; ($no,$meisyo) = split("<>", $line); foreach $x (@DEL) { if ("$x" eq $tmpnum) { $flag=1; last; } } if ($flag == 0) { push(@new,$line); } } open(OUT,">$tmpfile") || &error("Write Error : $tmpfile"); print OUT @new; close(OUT); ここまで 上のソースですと、エラーこそならずに(そうみえているだけかもしれません)終わりますが、データ削除が正しく出来ませんでした。 説明不足があるかもしれませんので、指摘いただけますと幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ロックファイルの自動削除

    現在、以下のように記述されており、 ロックされてから2秒後に解除されるはずが 2秒後の最初の投稿の際にはロックファイルが存在している旨のメッセージが表示され、 (その際にロックファイルが自動削除されるが投稿はできない) その次の投稿から投稿が可能になるのですが、 2秒後の投稿の際にそのロックファイルを自動削除し、 投稿もできるようにするにはどのように書きかえたらいいのかお教えいただけませんか? ## --- ファイルロック sub lock { if ($_[0]) { $lock_file = $_[0]; } else { $lock_file = $lockfile; } if ($lock_file ne "") { local($flag) = 0; foreach (1 .. 5) { if (-e $lock_file) { sleep(1); } else { open(LOCK,">$lock_file"); close(LOCK); $flag = 1; last; } } if ($flag == 0) { $past_lock = -M "$lock_file"; if ($past_lock * 24 * 60 * 60> 2) { &unlock("$lock_file"); } &error("システムエラー","アクセスが集中しているため、タイムアウトとなりました。(ロックファイルが存在しています)"); } } } ## --- ファイルロック解除 sub unlock { if ($_[0]) { $lock_file = $_[0]; } else { $lock_file = $lockfile; } if (-e $lock_file) { unlink($lock_file); } }

    • ベストアンサー
    • CGI
  • CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

    CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • htmlからcgiに変数を配列にして渡すとき

    フォームにて、質問1,2,3…と入力してもらい、 1を答えないで2を答えるとか、 2を答えないで3を答えるとかを排除したいので、 変数を配列にして受け取りたいのです。 とりあえず今のところはこうなってます。↓ #htmlファイル# <INPUT type="text" size="30" name="situmon[1]"> <INPUT type="text" size="30" name="situmon[2]"> ... としてcgiに持っていき、 #cgiファイル# for($i=1; $i<=4; $i++){ if($form{'situmon[$i]'} eq "" && $form{'situmon[$i+1]'} ne ""){ &error; #→エラーメッセージサブルーチン exit; } } のようにして受け取ろうとしてるのですが、うまくいきません。 上のようにhtmlではどう書くべきか、cgiではどう受け取るべきかを教えてくだされば嬉しいです。

    • ベストアンサー
    • CGI
  • $retry--の「--」の意味は?

    $retry--の「--」の意味は? ファイルロックについて調べていたら function lock(){ //ロックファイル $file = "lock.txt"; $lockDir= "lock/"; $lockfile = $lockDir . $file; //再挑戦回数 $retry = 3; //30秒以上古いロックは削除する if (file_exists($lockfile)) { $mtime = filemtime($lockfile); if ($mtime < time() - 30) { unlock($file); } } //ロック用ディレクトリを作成する while (!@mkdir($lockfile, 0755)) { if ($retry-- <= 0) { print "只今混雑しています。";exit;} sleep(1); } } のコードを見つけました。「$retry--」の2回ハイフンでどんな意味なのでしょうか? ちなみに他に書き換えるとしたらどんなコードでかけるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • 2つのデータを統合を効率よく出来ません

    2つのデータを統合を効率よく出来ません 2つのデータを統合するプログラムをperlで作成しています。 データはテキストでサーバー環境にあります。 クラスデータ 1,1-1,1年 2,1-2,1年 3,1-3,1年 4,2-1,2年 5,2-2,2年 6,3-1,3年 7,3-2,3年 名前データ 1,田中,たなか 2,伊藤,いとう 3,斎藤,さいとう 4,上野,うえの 5,大阪,おおさか 6,福島,ふくしま 7,矢部,やべ 最終データ 1,田中,たなか,1-1,1年 2,伊藤,いとう,1-2,1年 3,斎藤,さいとう,1-3,1年 4,上野,うえの,2-1,2年 5,大阪,おおさか,2-2,2年 6,福島,ふくしま,3-1,3年 7,矢部,やべ,3-2,3年 以下のプログラムで動作させていますが、件数が多くなると非常に非効率となり動作しなくなります。 ※公開用にプログラムを修正しています。おかしい部分があるかもしれません。 (ここから) 略・・・ open(DB10,"<$namefile") || next; flock(DB10, 1); @lines10 = <DB10>; close(DB10); foreach $lines10 (@lines10) { ($seq,$name,$kana,$classnew,$nennew) = split("<>", $lines10); open(DATA,"$classfile")|| die &error(" $classfile を読み込みopen出来ません"); flock(DATA,1); @lines11 = <DATA>; close(DATA); foreach $lines11(@lines11){ ($seq1,$class,$nen) = split("<>", $lines11); $classnew = $class; $nennew = $nen; open(DATA1,"$classfile")|| die &error(" $classfile を読み込みopen出来ません"); flock(DATA1,1); @line21 = <DATA1>; close(DATA1); foreach $line21(@line21){ local(@val) = split("<>", $line21); if($seq1 == $val[0]){ $line21 ="";} push(@new,"$line21"); } push(@new,"$seq1<>$class<>$nen\n"); open(DATA1,">$classfile")|| die &error(" $classfile をwrite出来ません "); flock(DATA1,2); print DATA1 @new; close(DATA1); @new = ""; } @new1 = ""; open(DB12,"<$namefile") || &error("Can't open $namefile"); flock(DB12, 1); @line12 = <DB12>; close(DB12); foreach $line12 (@line12) { local(@val1) = split("<>", $line12); if($seq == "$val1[0]"){ $line12 ="";} push(@new1,"$line12"); } push(@new1,"$seq<>$name<>$kana<>$classnew<>$nennew<>\n"); open(DB12,">$namefile")|| die &error(" $namefile をwrite出来ません "); flock(DB12,2); print DB12 @new1; close(DB12); } } (ここまで) プログラムの流れとしては(私が解釈している)、2つのファイルを1件読み込み更新を最終行へ毎回行っているというものになります。 恐らく、もっと効率の良い方法があるとは思っているのですが、アイデアが浮かばす止まってしまいました。 このプログラムではなく別のものでもOKです。私がこの方法しかしらないのでこの記述をしています。 ファイルの更新系でアドバイスがいただけたらと思い書き込みます。 ご指導よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Ruby flagによるファイルの特定行の抽出

    こんばんは。 Rubyでファイルの特定行を抽出するプログラムを作っているのですが、 flagを立てて特定の場所から特定の場所までを指定する方法をとりたいと思っています。 ある程度までは書いたのですが、そこからどうすれば良いのかが分かりません。 なにとぞ御教授、御添削の程お願い致します。 data = File.open(fpath) do |f| 6 7 f.each_line do |line| 8 9 line.gsub!(/前事業年度特定投資株式/,"前事業年度") 10 line.gsub!(/当事業年度特定投資株式/,"当事業年度") 11 12 13 line.gsub!(/保有目的が純投資目的である/,"EOF") 14 line.gsub!(/保有目的が純投資目的の/,"EOF") 15 16 # next unless line =~ /保有目的が純投資目的以外/ .. line =~ /EOF/ 17 18 19 if $flag == 1 20 text << line.chomp unless line =~ /^\s+$/ 21 22 if line =~ /保有/ 23 $flag = 1 24 else if line =~ /EOF/ 25 $flag = 0

    • ベストアンサー
    • Ruby
  • ロックしたディレクトリが消えない(?)

    flock関数を使い、 $lockfile="./lock/lock.loc"; sub lock { foreach $i (1..6) { . . . if(open(LOCK,">$lockfile")){ if (flock(LOCK,6)) { $lock_flag = 1; last ; } } . . . } } という風にし、メインルーチンで&lockを実行し、ファイルロックしたのですが、flock(LOCK, 8)を使い忘れ、あとでFFFTPを使ってこれを消そうとしても、なにやらディレクトリが永遠に続いている感じになってしまい消せません。 /lock/lock.loc/lock.loc/lock.loc/lock.loc/lock.loc/... という風になっています。 それと元からlock/lock.locというディレクトリが存在したままflockを使ってしまったかどうかはちょっと確認していなかったのですが、使う前にあったとしたらlock.locはファイルではなく、ディレクトリです。 (mrdirを使ったロックなどをいろいろ試していたためです。) うまく説明できなかったのですが、どうすればこれは消せますか?後でflock(LOCK, 8)をやっても直りません・・ アップしたサーバーは@niftyです

    • ベストアンサー
    • Perl
  • ファイルからデータをうまく読み込めません

    ファイルからデータを読み込んでクラスに宣言した変数に格納したいのですがうまく出来ません ------------------------------------------ import java.io.*; class date{ public String name; public int ko,su; } public class Helloworld { public static void main(String args[]){ date[] dt = new date[2]; BufferedReader br = new BufferedReader(new FileReader("フルパス")); String line; try{ int i=0; while((line = br.readLine())!=null){ dt[i].ko = dt[i].su = 0; dt[i].name = line; line = br.readLine(); dt[i].ko = Integer.valueOf(line).intValue(); line = br.readLine(); dt[i].su = Integer.valueOf(line).intValue(); System.out.println("名前:" + dt[i].name); System.out.println("国語:" + dt[i].ko); System.out.println("数学:" + dt[i].su); i++; } br.close(); }catch(Exception e){ System.out.println("エラー情報:" + e); } } } -------------------------- 上記のソースで実行すると java.lang.NullPointerException とエラーが出てます FileReadernの部分にカーソルを当てると この要素には接続されたソースも、接続された Javadoc もないため、情報を検出できませんでした と表示されました

    • ベストアンサー
    • Java

専門家に質問してみよう