| HOME | FrontPage | 記事編集 | RSS |
PerlユーザのためのPHP PHP::5
- 1. ファイルハンドル
- 1-1. file
- 1-2. fopen、fclose、fread、fwrite
- 2. 文字列操作
- 2-1. split
- 2-2. join
- 2-3. 正規表現
- 2-3-1. preg_match
- 2-3-2. preg_replace
- 3. 配列操作
- 3-1. push
- 3-2. pop
- 3-3. unshift
- 3-4. shift
- 3-5. reverse
- 3-6. 結合
- 3-7. sort
- 4. レングスとか
- 5. まとめ
いざPHPを触ってみたら4年ぶりで完全に忘れていてマニュアルを最初から読み直した。制御構造についてPerlとの違いは七つ。
| 1 | Perlの$$hogeは参照の実体。PHPの$$hogeはPerlの${$hoge}と同義。 |
| 2 | PerlではelsifだけどPHPではelseif。 |
| 3 | PHPの変数名は配列とハッシュを問わず全て$で始まり、全変数が関数ローカル。 |
| 4 | 関数はfunction hoge(引数1,引数2)の形。 |
| 5 | ループ制御はPerlではnextとlast。PHPではcontinueとbreak。 |
| 6 | PHPでは比較演算子に文字列と数値の区別が無い(eqとneが無く全て==と!=) |
| 7 | 配列への一括代入は$array = array(1,2,3,4,5);の形。連想配列なら$hash = array('key1' => 1, 'key2' => 2, 'key3' => 3);の形。 |
あとはファイルハンドルと文字列操作と配列操作がわかれば、とりあえず何でも書ける。気がする。
1. ファイルハンドル
つまりファイルやプロセスの読み書きのことです。
1-1. file
下の二行でファイルh2.txtの内容をブラウザに出力します。
$array = file("h2.txt");
print join("<br>",$array);
PHPが便利なのは一部の関数で以下のような真似が出来ることです。
$array = file("http://www.yahoo.co.jp/");
print join("",$array);
これだけでYahooのトップページを表示します。
1-2. fopen、fclose、fread、fwrite
読込は以下です。
$fh = fopen("./any.txt", "rb");
print fread($fh, filesize("./any.txt"));
fclose($fh);
書込は以下です。
$fh = fopen("one.txt", "wb");
fwrite($fh,"一行目\n");
fwrite($fh,"二行目\n");
fclose($fh);
追加書込は以下です。
$fh = fopen("one.txt", "ab");
fwrite($fh,"三行目\n");
fclose($fh);
通常fopenのオプションはrとwとaと書いてありますが、互換性のためにb(バイナリ。Perlで言うbinmode)を付けるように強く推奨されています。freadの第2引数は読み込むバイト数です。なお、fopenもfileと同様にURIを指定できます。
$fh = fopen("ftp://username:password@example.com/dir/one.txt", "wb");
fwrite($fh,"HACKED");
fclose($fh);
このようにfwrite()でFTPアップロードも出来ます。
2. 文字列操作
実際使うのはsplitとjoinと正規表現ぐらいのもんでしょう。
2-1. split
$array = split("<>", 'aaa<>bbb<>ccc<>ddd', 3);
print $array[1];
これでbbbを表示。第三引数はPerlと同様にリミットです。3なら先頭から3つに分ける。
2-2. join
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
$snt = join("<>", $array);
print $snt;
表示はaaa<>bbb<>ccc<>ddd。
2-3. 正規表現
多少遅くてもPerlユーザはPerl互換のpreg系しか使いませんが、preg系の方がereg系より速いらしい。
2-3-1. preg_match
いわゆる正規表現マッチです。
$sent = "Fuck off chink go back your fucking chink country you should study English chink?!";
if(preg_match("/CHINK/i", $sent)) {
print "bitch";
} else {
print "beautiful";
}
大文字小文字同一視で$sentがCHINKを含めばbitch、含まなければbeautifulを表示します。第3引数に任意の配列を渡すと後方参照がセットされます。
2-3-2. preg_replace
いわゆる正規表現置換です。
$sent = "Fuck off chink go back your fucking chink country you should study English chink?!";
$sent = preg_replace("/CHINK/i", "korean", $sent);
print $sent;
注意点は2行目先頭の$sent=。Perlのように引数を更新するのではなく、置換後の文字列を戻り値として返すので、先頭に$sent=を付け忘れると何も起こりません。括弧を付ければPerlと同様に$1〜$9で後方参照が可能です。
3. 配列操作
pushやunshiftやsortのことです。
3-1. push
PHPではarray_pushという名前です。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
array_push($array,"eee");
print join("<br>", $array);
配列末尾にeeeを追加します。ただpushについては主に配列の末尾に配列を追加することを想定しておるようで、公式マニュアルいわく、追加する要素が一つであればpushの代わりに
$array[]="eee";
とした方が高速だそうです。Perlではいかなる時も関数が高速です。
3-2. pop
PHPではarray_popという名前です。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
array_pop($array);
print join("<>", $array);
配列末尾のdddを削除します。
3-3. unshift
PHPではarray_unshiftという名前です。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
array_unshift($array,"zzz");
print join("<br>", $array);
配列先頭にzzzを追加します。
3-4. shift
PHPではarray_shiftという名前です。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
array_shift($array);
print join("<>", $array);
配列先頭のaaaを削除します。
3-5. reverse
PHPではarray_reverseという名前です。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
$array = array_reverse($array);
print join("<>", $array);
表示はddd<>ccc<>bbb<>aaa。
これも引数の配列を書き換えないので注意しましょう。
3-6. 結合
array_mergeを使います。
$array1 = array('aaa', 'bbb', 'ccc', 'ddd');
$array2 = array('eee', 'fff', 'ggg', 'hhh');
$array3 = array_merge($array1, $array2);
print join(",", $array3);
表示はaaa,bbb,ccc,ddd,eee,fff,ggg,hhh。
Perlの感覚だと$array3 = array($array1,$array2)またはarray_push($array1,$array2)で出来そうな気がしますが、どちらも失敗します。PHPは根っこが腐ってるからね。
3-7. sort
sortで昇順ソート、rsortで降順ソート。
$array = array("100","9","50","0");
sort($array,SORT_NUMERIC);
print join(", ", $array);
表示は0, 9, 50, 100。第2引数のSORT_NUMERICは数値と解釈してソートする指定です。文字と解釈して(文字コードで)ソートする場合はSORT_STRINGを指定します。ksort(昇順)とkrsort(降順)を使えば連想配列をキーでソートできます。どうもPerlのように関数やブロックを使うことは出来ないようで、連想配列を上手く使わないと目的を達成できないことが多いかもしれない。
4. レングスとか
文字列の長さを知るにはstrlenを使います。
$word = "moemoe";
print strlen($word);
表示は6です。配列の要素数を知るにはcountを使います。
$array = split("<>", 'aaa<>bbb<>ccc<>ddd');
print count($array);
表示は4です。
5. まとめ
もうなんかblogに書く内容じゃねえな(;´Д`)y-~
でもおかげでぼちぼち思い出してきた。実はPHPには別途mb(マルチバイト)系の関数群があって、mb_splitやmb_preg_matchなどが日本語に対応しています。「日本語に対応している」と言われると便利に感じるかもしれないけど、案外そうでもない。たとえばmb_strlenって関数はstrlenと同様に文字数を数えます。ただし全角文字を1文字と認識するのでバイト数とは一致しません。バイト数を知りたい場合がほとんどなので、あまり使う機会が無い。こういうのは存在だけ知っておいて、いざ使う段階になって調べ直すのが良いと思いますよ。
speed
/ 2008.02.09 20:03
BBSWiki ver.1.50 Final blogmode.
Copyleft (!C) 2005-2007 SUICIDE BLONDE JP.
All Lefts Reserved.
- 2008 Recent 50 Entries
- Windows Vista x64
2008.12.31 19:50 - 性格が良いor悪い
2008.12.30 02:45 - PC-MDVD/U2
2008.12.28 02:25 - USBメモリ5GBあたり\1,000
2008.12.25 22:10 - 植田佳奈叩かれる
2008.12.24 22:29 - 哲学熱再燃
2008.12.23 03:30 - Cha-la Head Cha-la
2008.12.21 13:47 - 紅第6巻
2008.12.17 02:19 - 民団、民主・公明支援へ
2008.12.16 03:30 - 口論における男性の勝率
2008.12.15 00:14 - 本業の話
2008.12.14 23:15 - 鉄拳王になったよー
2008.12.13 18:34 - やっぱりuse warningsを使おう
2008.12.11 23:02 - WinningEleven 2009 (PS3)
2008.12.03 20:31 - Ishkur's Guide to Electronic Music
2008.11.30 21:35 - ゲームも必要
2008.11.30 15:41 - UbuntuWWWサーバのセットアップ
2008.11.29 22:14 - らき☆すたOVA
2008.11.28 01:58 - Ubuntuデスクトップ用.vimrc
2008.11.27 22:02 - キーボードを水洗い
2008.11.25 01:33 - よりよい世界をMakeするために
2008.11.23 13:07 - だいぶ疲れも取れたようです
2008.11.20 08:56 - HDMI接続
2008.11.14 00:59 - またモニタ買った
2008.11.12 04:41 - うちの平尾がやりおった!!
2008.11.09 21:32 - ワイヤレスキーボード買った
2008.11.06 23:01 - PS3その後
2008.11.04 22:59 - PS3でかすぎ
2008.10.31 09:22 - ゲームばっかり!!111
2008.10.29 09:10 - 1$92yen
2008.10.27 23:29 - ヒアドキュメント中のハッシュ要素
2008.10.26 15:27 - 女性差別
2008.10.25 23:08 - 鉄拳5サウンドトラック
2008.10.24 04:11 - 新blogやることありすぎ
2008.10.22 00:39 - 鉄拳 DarkResurrection (PSP)
2008.10.20 00:08 - Linuxだけで足りるかも
2008.10.18 23:25 - PS3予約した
2008.10.18 00:26 - Firefox使えない
2008.10.17 23:18 - XML+XSL+Microformats
2008.10.17 00:59 - Minibuffer+AutoPagerize+LDRize
2008.10.15 22:52 - 心の余裕
2008.10.15 01:47 - IPパケットからWEPキーを抽出
2008.10.14 22:45 - Fedora Core4の壁紙
2008.10.13 19:29 - Fedoraマジおすすめ
2008.10.13 17:26 - 新サーバ構築中
2008.10.11 23:18 - 『安心ネットづくり』促進協議会
2008.10.09 22:42 - サーバ/インフラを支える技術
2008.10.09 20:57 - 田中理恵エロすぎ
2008.10.06 23:03 - 翻訳法人
2008.10.05 13:42 - ObjectDriver使えねえ。。
2008.10.02 22:39
- Archive
- 2006年
- 2006年01月
- 2006年02月
- 2006年03月
- 2006年04月
- 2006年05月
- 2006年06月
- 2006年07月
- 2006年08月
- 2006年09月
- 2006年10月
- 2006年11月
- 2006年12月
- 2007年
- 2007年01月
- 2007年02月
- 2007年03月
- 2007年04月
- 2007年05月
- 2007年06月
- 2007年07月
- 2007年08月
- 2007年09月
- 2007年10月
- 2007年11月
- 2007年12月
- 2008年
- 2008年01月
- 2008年02月
- 2008年03月
- 2008年04月
- 2008年05月
- 2008年06月
- 2008年07月
- 2008年08月
- 2008年09月
- 2008年10月
- 2008年11月
- 2008年12月