x.x.x.x

| HOME | FrontPage | 記事編集 | RSS |

PerlユーザのためのPHP   PHP::5

  1. 1. ファイルハンドル
  2. 1-1. file
  3. 1-2. fopen、fclose、fread、fwrite
  4. 2. 文字列操作
  5. 2-1. split
  6. 2-2. join
  7. 2-3. 正規表現
  8. 2-3-1. preg_match
  9. 2-3-2. preg_replace
  10. 3. 配列操作
  11. 3-1. push
  12. 3-2. pop
  13. 3-3. unshift
  14. 3-4. shift
  15. 3-5. reverse
  16. 3-6. 結合
  17. 3-7. sort
  18. 4. レングスとか
  19. 5. まとめ

いざPHPを触ってみたら4年ぶりで完全に忘れていてマニュアルを最初から読み直した。制御構造についてPerlとの違いは七つ。

1Perlの$$hogeは参照の実体。PHPの$$hogeはPerlの${$hoge}と同義。
2PerlではelsifだけどPHPではelseif。
3PHPの変数名は配列とハッシュを問わず全て$で始まり、全変数が関数ローカル。
4関数はfunction hoge(引数1,引数2)の形。
5ループ制御はPerlではnextとlast。PHPではcontinueとbreak。
6PHPでは比較演算子に文字列と数値の区別が無い(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文字と認識するのでバイト数とは一致しません。バイト数を知りたい場合がほとんどなので、あまり使う機会が無い。こういうのは存在だけ知っておいて、いざ使う段階になって調べ直すのが良いと思いますよ。

BlogMode speed member / 2008.02.09 20:03

These pages are designed for NN7 & IE6.
BBSWiki ver.1.50 Final blogmode.
Copyleft (!C) 2005-2007 SUICIDE BLONDE JP.
All Lefts Reserved.

Valid XHTML 1.0 Strict Valid CSS!