ヒアドキュメント内で展開する変数と展開させたくない変数

基本的にいきあたりばったりで必要なときに必要なことを勉強してるので芋づる式に調べることがどんどん出てくる。

ヒアドキュメント内で変数の挙動が怪しいので、ちゃんと調べてみた。

まず、変数をきっちり認識させるためには変数名をかっこで囲んであげる

${ant}

ただし、これだとヒアドキュメント内で変数が展開されてしまうので、変数のままにしておきたい時は

\${ant}

と、エスケープをしてあげる。

ある文字から改行までを選択する

正規表現の基本的な使い方はだいたいわかったんだけど、改行の扱いでひっかかった。
ある文字からその行の最後までを選択したい場合。

「文末に改行がくる」というのを、直訳?すると上手くいかなかった。
30分くらいいろいろやって

特定の文字[^\n]*

これで上手く行った。
「文末に改行が来る」ではなく、「改行以外を選択する」というように逆で表現するとあっさり解決。
他にもこの逆を使うパターンで解決することは多いように思う。

require_onceを使うときの文字化けを防ぐ

携帯サイトを作っていて、require_once使用時に文字化けしてとらぶったのでメモ。

携帯用のサイトは文字コードをshift-jisで作る必要がある。

shift-jisで作ったページに別ファイルをrequire_onceで呼び出す場合、呼び出すファイルの文字コードがUTF-8だと文字化けしてしまう。

最初は呼び出す前の時点で、ファイルの中ですでにechoで出力していたんだけど、これだと文字化けが治せなかった。

呼び出すファイルの文字コードをUTF-8のまま使うには、require_onceで呼び出した後にechoで出力すると解決。

まず、呼び出すファイル内で出力したいものを変数$rに入れておく

そして呼び出すときに、文字コードを変換してあげる

わかってしまえば簡単なんだけど、結構悩んでしまった。

正規表現

正規表現をちょこちょこ使うようになった。
以前は手でやっていたことも大抵は自動でできることがわかってきた。手で時間をかけて何かやると、何か物事が進んでいるような気にはなるけど、思い込みでそう思うだけで、まったく相関関係はないので気をつけようと思った。

あと正規表現って奥が深そう。
いろんなことができそうなだけに、何かやろうとすると凄く時間がかかる。
Perlの勉強用に買った本、Perl言語プログラムレッスン(結城浩著)に、正規表現の練習用として、ヒトゲノムのY染色体の全ゲノムデータのことが載っていた。小説などの文章も、ゲノム情報も、単純な物の組み合わせで情報を表してるから、そう考えると面白いなぁと思う。

正規表現をある程度使えるようになったら、プログラム関係の勉強は一段落させてもっとアウトプットを増やしていく予定。

データベースの中身を書き換える

自分でデータベースを作り、そこからデータを取り出す。

取り出したデータを処理する

処理したデータを同じテーブルの別カラムに入れる(修正する)。

これ最初手こずったけど、一度やると簡単。

取り敢えず以下のように書いて動いたのでメモ

//データベースからデータを取り出す
//クエリ生成
$query=”SELECT * FROM data”;
//実行
$result = mysql_query($query);

//引き出したデータを処理
while ($row = @mysql_fetch_assoc($result)){
$num = $row[‘num’];
$name = $row[‘name’];

ここで好みの処理をする

$ant=”取り出したデータを処理した結果をここへ入れる”;
///UPDATE機能を使いデータ修正(データベースのnumにはauto_incrementでユニーク値を入れておく。WHEREで希望のデータのみ一個ずつデータの修正ができる)
$query1=”UPDATE data SET kakoudata=\””.$ant.”\” WHERE num=”.$num;
mysql_query($query1);

//データ書き換えのループ処理完了
}

一番引っかかったのが、どうでもよい部分で、データを入れるときの処理方法。数字は成功したけど、文字が何度やっても上手くいかないので30分くらい悩む。
結局よく見ると、変数に直接文字が入っていたから、クエリ生成するときに、=の後に直接文字が入ってエラーになってた。エスケープしてやると成功。クエリをプリントしてミスに気づいた。

これでデータベース関連で必要なことは一通りできるようになった。一回仕組みを作って単純化しメモしておけば、次使うときは5分で使えるので楽。こういうのを積み重ねていくと何気に差がつくんじゃないかと思う。