• ベストアンサー

正規表現に関して

指定のファイルがない、あるいは、指定ファイル内に「abc」という文字列が含まれていない場合には、そのファイルに「abcd」という文字列を保存したいのですが、(例えば下記のように)色々と試したのですが、上手く動作しませんでした。私の考え方か記述方法に間違いがあると思うのですが、正しい記述方法をご教授いただけないでしょうか。恐れ入りますが、よろしくお願いいたします。 ###ファイルからデータを取り出す $fileA="data.dat"; #ファイル名の指定。 open(FILEA, "$fileA"); #ファイルを開く @allbodyA = <FILEA>; #ファイル内のデータを配列に close(FILEA); #ファイルを閉じる $tmpA=@allbody; #配列のデータを変数に ###文字列検索による分岐 unless($tmpA=~ /abc/){ #「abc」が含まれているか確認してるつもりです $tmpA="abcd"; #(含まれてないときはファイルに「abcd」を保存したい。) @allbodyA=$tmpA; #print "作成成功"; ###ファイルにデータを保存 open(FILEA, ">$fileA"); #ファイルを開く print FILEA @allbodyA; #ファイルに配列「abc」を close(FILEA); #ファイルを閉じる } 申し訳ございませんが、何卒よろしくお願いいたします。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.2

 $tmpA=@allbody;  この文では、配列の数(ここではファイルの行数)を $allbodyA に保存することになってしまいます。  @allbodyA = <FILEA>;  という文を、    $/ = '';    $tmpA = <FILEA>;    $/ = "\n";  というふうに改造し、「$tmpA=@allbody;」の部分は削除してみてください。  それから、「@allbodyA=$tmpA;」の部分もおかしくなる可能性があるので、「@allbodyA=($tmpA);」にしてみてください。  これは $tmpA を一時的に配列とみなす処置です。

oomiyaji
質問者

お礼

大変丁寧にご説明いただき、ありがとうございました。修正の結果、無事動作いたしました。本当にありがとうございました。とても勉強になりました。

その他の回答 (1)

  • mohao
  • ベストアンサー率15% (10/63)
回答No.1

$fileA="data.dat"; open FILEA,"$fileA"; $data=""; while (<FILEA>) { $data.=$_; } close FILEA; if ($data!=~/abc/) { $tmpA="abcd"; open FILEA,">$fileA"; print FILEA $tmpA; close FILEA; }

oomiyaji
質問者

お礼

ありがとうございました。具体的に、ソースを記述していただき、大変助かります。大変感謝しております。

関連するQ&A