トップページ⇒php
593コメント196KB

【待望】PerlユーザのためのPHP入門

■ このスレッドは過去ログ倉庫に格納されています
0001俺様03/02/27 15:17ID:tJsRCtRD
見事Perl→PHPへの脱皮に成功した俺様が
両者の違いを中心に講義してやる。
今までPerlマンセーだったやつはこれを機にPHPに変更しよう也。
質問もガンガン書いてくれ。
このPerlの文はPHPだとどう書くの?とか。
0178俺様03/03/06 16:42ID:SMJB497B
>>177
いや、いい加減な仕様ってのは今回に限ってはPHPに対していったのさ。
>>157で言ったようにPerlの場合は予想したとおりになったからね。

俺が言いたかったのはPHPの場合が>>161みたいになっているのが
いい加減だなあってことだ。
0179nobodyさん03/03/06 17:01ID:???
PHPも、優先度は、=の方が上だから、そのままの結果。ではないのか?
0180俺様03/03/06 17:04ID:SMJB497B
>>179
>優先度は、=の方が上
ソースキボンヌ。
俺が調べた結果だと=の方が下だった。
0181nobodyさん03/03/06 17:05ID:G2YpYyeT
◆ようこそ!!ピンクエンジェルです★
http://www.pink-angel.jp/betu/index.html
0182nobodyさん03/03/06 17:06ID:???
本来はd=a?b:c;という形で使う者なんだから、=の方が低くて当然。
左辺値になるってのがおかしいんだよ(-_-;)
0183nobodyさん03/03/06 19:06ID:???
>>180
あぁ。最低から並べたものって書いてあった。うぅ。
0184nobodyさん03/03/06 21:36ID:???


180 名前:俺様 投稿日:2003/03/06(木) 17:04 ID:SMJB497B
>>179
>優先度は、=の方が上
ソースキボンヌ。
俺が調べた結果だと=の方が下だった。


181 名前:nobodyさん 投稿日:2003/03/06(木) 17:05 ID:G2YpYyeT
◆ようこそ!!ピンクエンジェルです★
http://www.pink-angel.jp/betu/index.html


182 名前:nobodyさん 投稿日:2003/03/06(木) 17:06 ID:???
本来はd=a?b:c;という形で使う者なんだから、=の方が低くて当然。
左辺値になるってのがおかしいんだよ(-_-;)


183 名前:nobodyさん 投稿日:2003/03/06(木) 19:06 ID:???
>>180
あぁ。最低から並べたものって書いてあった。うぅ。

182 名前:nobodyさん 投稿日:2003/03/06(木) 17:06 ID:???
本来はd=a?b:c;という形で使う者なんだから、=の方が低くて当然。
左辺値になるってのがおかしいんだよ(-_-;)


183 名前:nobodyさん 投稿日:2003/03/06(木) 19:06 ID:???
>>180
あぁ。最低から並べたものって書いてあった。うぅ。
0185nobodyさん03/03/06 23:54ID:aj5F0raF
教えて下さい。
配列@arrayに、'12-34','34-56'...みたいなデータが入ってて、-の右側でソートしたい場合、

@tmp = map { (split /-/)[1] } @array;
@array = @array[ sort { $tmp[$b] <=> $tmp[$a] } 0 .. $#tmp ];

でやってたんですが、同じことをPHPでやるにはどうしたらいいんでしょう?
0186俺様03/03/07 00:46ID:86BQl/fj
>>185
実はそれに似たようなので、俺様も苦労したんだな〜

1<>32<>43<>2
3<>41<>443<>232
...
ってな感じでデータが入ってて
3列目(上だと43,443)だけでsortしたいなーって。
で、結局よくわからんかったから自己関数作った。

function cmp ($a, $b) {
$tmp1 = explode("<>", $a);
//文字列$a(="1<>32<>43<>2")を<>で区切って配列に代入
//例えば、$tmp1[0]=1,$tmp1[1]=32
$tmp2 = explode("<>", $b);
if($tmp1[2] == $tmp2[2]) return 0;
elseif($tmp1[2] > $tmp2[2]) return -1;
else return 1;
}

usort ($array "cmp");
//ユーザー定義の比較関数により値で配列をソート

まあ、usortの使い方とかはマニュアルで調べてクレイ。
http://www.php.net/manual/ja/ref.array.php

俺様のと若干違うようなので、もっと簡単な方法があるかも知れんが
参考までに。
0187nobodyさん03/03/07 00:46ID:???
教えて下さい。
配列@arrayに、'12-34','34-56'...みたいなデータが入ってて、-の右側でソートしたい場合、

@tmp = map { (split /-/)[1] } @array;
@array = @array[ sort { $tmp[$b] <=> $tmp[$a] } 0 .. $#tmp ];

でやってたんですが、同じことをPHPでやるにはどうしたらいいんでしょう?教えて下さい。
配列@arrayに、'12-34','34-56'...みたいなデータが入ってて、-の右側でソートしたい場合、

@tmp = map { (split /-/)[1] } @array;
@array = @array[ sort { $tmp[$b] <=> $tmp[$a] } 0 .. $#tmp ];

でやってたんですが、同じことをPHPでやるにはどうしたらいいんでしょう?教えて下さい。
配列@arrayに、'12-34','34-56'...みたいなデータが入ってて、-の右側でソートしたい場合、

@tmp = map { (split /-/)[1] } @array;
@array = @array[ sort { $tmp[$b] <=> $tmp[$a] } 0 .. $#tmp ];

でやってたんですが、同じことをPHPでやるにはどうしたらいいんでしょう?教えて下さい。
配列@arrayに、'12-34','34-56'...みたいなデータが入ってて、-の右側でソートしたい場合、

@tmp = map { (split /-/)[1] } @array;
@array = @array[ sort { $tmp[$b] <=> $tmp[$a] } 0 .. $#tmp ];

でやってたんですが、同じことをPHPでやるにはどうしたらいいんでしょう?
0188nobodyさん03/03/07 03:08ID:???
配列にしてからソートした方がよくない?
0189nobodyさん03/03/07 14:44ID:???
>>185
Perlならこれでいいんじゃない?

@array = sort { (split(/-/,$a))[1] <=> (split(/-/,$b))[1] } @array
0190nobodyさん03/03/07 16:22ID:???
>>185

$i = 0;
for($array[$i]) {
list($first, $second) = explode("-",$array[$i]);
$first[] = $first;
$secondt[] = $second;
$i++;
}

array_multisort($second, $first);

$i++;
while ($first[$i]){
$array[$i] = $first[$i] . "-" . $second[$i];
$i++;
}

PHP初心者スレで書いた奴を改善してみた。
0191nobodyさん03/03/07 18:15ID:???
>189
ソートの度になにかの処理をするって遅くならん?
0192$n日後03/03/07 18:53ID:???
現在時刻から$n日後を求めたいいいだけどprelだと以下
($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime(time + $n*24*3600);
PHPだとどうなるんだ?
あのツェラーの公式だっけか?
0193nobodyさん03/03/07 18:56ID:???
>>192
>$n日後

なら純粋にtime()に86400 * nを足せばいいのでは?
0194nobodyさん03/03/07 19:23ID:???
$i = 90;

$year = date("Y", time());
$day = date("n", time());
$month = date("j", time());
$hour = date("G", time());
$minute = date("i", time());
$second = date("s", time());

$timestamp = mktime($hour, $minute, $second, $month, $day + $i, $year);

print date("Y/n/j G:i:s", $timestamp);

まぁ別に変数を使う必要も無いわけだが。
0195$n日後03/03/08 13:58ID:NNyx9+/Y
>>193 >>194
レスサンク!
ツェラーの公式とはまた違うか、・・・・。
PHPではツェラーの公式なんか使わなくても簡単に指定した日の
曜日とかも算出出来ちゃうんだね。
--抜粋--
また、カレンダー等でその日の曜日を知りたい時、「perl」では
Zeller(ツェラー)の公式を使って算出しなければいけませんが、
「php」では「string date (w , [timestamp])」とすると、
「timestamp」で指定した日にちの曜日を数字で返してくれます
(0(日曜)〜6(土曜))。極端な例を2点ほどあげましたが、
他にも便利な関数が数々あります。
--抜粋--
ttp://bin5.info/useful/php/php_02.html
0196nobodyさん03/03/08 13:59ID:???
>>195
質問が変わっている。
0197$n日後03/03/08 14:09ID:???
>>196
いやいや、これはこれであれはあれで・・・
失礼すました。
0198nobodyさん03/03/08 14:32ID:???
Perlの場合、自前で計算したくないなら、Date::Calcを使えばいい。

>>194の回答はアホ過ぎ。timeの戻り値がシリアル値なんだから、
その性質を使わないのは勿体無い。
0199nobodyさん03/03/08 15:29ID:???
>>193
うるう秒はどうするの?
0200nobodyさん03/03/08 15:35ID:???
>>199
うるう秒の意味わかってるか?
で、それをどうしたいのか?
0201nobodyさん03/03/08 15:37ID:???
うるう秒が蓄積されて誤差が1日を超えるような時間は、32bitのtimeでは指定できない。

でいいかな?

うるう秒をちゃんと考えるなら、>>194の方法で・・。
0202nobodyさん03/03/08 15:53ID:???
list($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time() + $n*24*3600);
0203nobodyさん03/03/08 15:55ID:???
>>198
「アホでも判るように。」が信条なんだが。

で、後学の為にその性質を使ったコードを見せて頂きたい。
0204nobodyさん03/03/08 15:56ID:???
reloadなしで書くとこうなるわけですね。
>>202
サンクス

吊ってきま。
0205nobodyさん03/03/10 16:59ID:???
つづきまだー
0206&rlo;ega待期&lro;03/03/10 17:03ID:EpMeREtC
0207nobodyさん03/03/10 17:11ID:???




















0208俺様03/03/10 17:47ID:SvAZl1u/
そろそろネタ切れだ。
以上の知識でもうどんな物でも
Perl→PHPの移行はできるはずだ。

練習として誰かYomiサーチを移植してみよう。
0209nobodyさん03/03/10 18:34ID:???
>>208
削除依頼よろしく。
0210nobodyさん03/03/10 20:36ID:???
俺様、ちょっち待てよ。
Yomiサーチの移植の続きやれよ。(w
0211nobodyさん03/03/10 20:37ID:???
>>210
出来るわけ無いだろう。このスレ読む限りでは。
0212nobodyさん03/03/10 21:09ID:???
dbを触るところまでやってほしかったっす。
0213俺様03/03/10 22:09ID:SvAZl1u/
よっしゃ。じゃあMySQLまでやろう。
というか俺が今その勉強中だから

まあ(・∀・)つ目 オチャデモノンデマテ!
0214nobodyさん03/03/10 22:21ID:???
>>213
死ね
0215俺様03/03/10 22:26ID:KPB0lsuM
>>214
(´Д⊂
0216nobodyさん03/03/10 22:32ID:Hr2fHuuO
  ∋8ノノハ.∩
   川o・-・)ノ <先生!こんなのがありました!
__/ /    /   
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/saitama/
0217nobodyさん03/03/10 23:02ID:c9OmtJD2
PHPはいいからDelphiおしえれ
0218俺様死ね03/03/10 23:02ID:???
>>217
何が聞きたい?
0219nobodyさん03/03/10 23:03ID:???
>>218
Perlとの違い
0220俺様死ね03/03/10 23:04ID:???
>>219
もうちょい具体的に。激しく違う。としか言いようがない。
0221俺様03/03/10 23:17ID:KPB0lsuM
Delphiは板違いなのでプログラム板で。
0222nobodyさん03/03/10 23:28ID:???
>>221
釣りですか?
真性ならプログラム技術板のPerlスレでも似たようなことを言っちゃうんだろうな。
0223nobodyさん03/03/10 23:35ID:???
>>220
ワラタw
0224nobodyさん03/03/11 10:00ID:???
このスレでは、いずれ php.ini の解説もしてくれますか?
俺が Perl → PHP で一番悩んでるのが php.ini (により定まる動作環境?) なんだよね。
こっちのサーバでは動くのにあっちのサーバでは動かない、とかとか。
0225nobodyさん03/03/11 10:22ID:???
>>224
それって各鯖の鯖管に問い合わせるべきじゃないのか?
知っててもそれじゃ手が出せないだろ。
0226nobodyさん03/03/11 10:26ID:???
>>225

php.iniの設定ってある程度はコード中で変えられたと記憶。
0227nobodyさん03/03/11 10:31ID:???
>>225
問題解決のためならその通りですが、
予備知識が無いと、聞きようが無い and 読みようが無いと思ったのさ。

詳しくは本でも買って読め、ということになるのかもしれないけど、
Perlユーザ向けの *入門編レベル* で十分なので、
抑えておくべきポイントを教えてくれると嬉すぃ。
0228nobodyさん03/03/11 10:36ID:???
>>227
phpinfo呼び出す。

後は値でどういう設定かは見当が付く。
0229nobodyさん03/03/11 10:42ID:???
もちろん、一番最初に
<?php
phpinfo();
?>
だけ書いたファイルを置く、これはやってます。

ただ、
> 後は値でどういう設定かは見当が付く。
これがね…。
要点だけで良いので、時間余ったらよろしく。>>俺様
0230俺様03/03/11 11:10ID:+7fowk1S
まあ、入門レベルならそこまで弄る所はないだろうというのが本音だが。
>こっちのサーバでは動くのにあっちのサーバでは動かない
これで困っているなら、なぜ動かないのかを検討する方が先だろうし。

まあ、php.ini自体に英語で最初から説明が書いてあるので
それを見ながら幾つか拾ってみよう。
0231俺様03/03/11 11:17ID:+7fowk1S
まずここはサーバで違いがあるところが多い。

; Safe Mode
safe_mode = Off(デフォルト時)

セーフモードとは何か?についてはマニュアルに結構書いてある。
http://www.php.net/manual/ja/features.safe-mode.php
http://www.php.net/manual/ja/features.safe-mode.functions.php

見ればわかるとおり、Onにすると使えなくなる関数とかがいくつか出てくるが
共用鯖ではOnにしている所がかなり多いので
On上での動作確認をした方がいいだろう。

0232俺様死ね03/03/11 11:19ID:???
>>231
お前、全部説明する気か?大変すぎだぞ。それ。
0233俺様03/03/11 11:23ID:+7fowk1S
というか便利なページ発見。
http://www.net-newbie.com/postgres/php.ini-recommended.txt

PHPにはphp.ini-recommendedという推奨設定ファイルが付いている。
上はその日本語訳のようだ。
0234俺様03/03/11 11:28ID:+7fowk1S
>>232
まあ、重要な部分だけあといくつか。
あとはその日本語訳をよんでクレイってことで。

これも確かめたほうがいいな。
register_globals = Off

Onにすると変数がグローバル変数となってしまう(だったっけ?)
俺はOnにしたことないからよく知らんが。
4.1.0以降でデフォルトがOnからOffに変わったので注意すべき。
Onのサイトのみで動いていたものをOffのサイトで動かすには
結構スクリプトの書き換えが必要。
0235俺様死ね03/03/11 11:31ID:???
>>234
違うぞ。

フォームからの情報がそのまま変数として展開されるか、$_GET $_POSTなどの連想配列?の要素として格納されるかの違いだ。
0236俺様03/03/11 11:37ID:+7fowk1S
; UNIX: "/パス1:/パス2"
;include_path = ".:/php/includes"
;
; Windows: "\パス1;\パス2"
;include_path = ".;c:\php\includes"

必要なら先頭の『;』は外しておこう。

例えば、DBで便利なPearを使うなら
include_path = ".;c:\php\includes;c:\php\pear;"
ってな感じにディレクトリを加えたほうが良い。
PearはPHPインストール時にデフォルトで付いてくるのだが
サーバー上でincludeできる設定になっていない場合、
自分で使いたかったらPear自体を自分のディレクトリに
アップロードしないとならないかも。
0237俺様03/03/11 11:47ID:+7fowk1S
>>235
フォローサンクス。

あと、
; cgi.force_redirect = 1
はこのように変えたほうがいい。
cgi.force_redirect = 0

ただ、PHP4.3.0はこの挙動がおかしくなるバグがあるらしいので注意。
0238俺様死ね03/03/11 11:49ID:???
>>237
CGIとして使うなら必須だな。
0239俺様03/03/11 11:51ID:+7fowk1S
後はこれだ。

extension_dir = ""

きちんとextensionsディレクトリをさすようにしておこう。
extension_dir = "C:/php/extensions"

0240俺様死ね03/03/11 11:51ID:???
>>239
じゃないとexpatとかmbstringが使えないからな。重要だ。
0241203/03/11 11:56ID:138sEgV0
何気に息が合ってそうなのが面白い。
がんがれ。
0242俺様03/03/11 12:03ID:+7fowk1S
ああ、あとそのディレクトリをきちんと設定しても
一部のDLLは使えるようになっていない。
Windows使いなら

;Windows Extensions
;Note that MySQL and ODBC support is now built in, so no dll is needed for it.
;
;extension=php_bz2.dll
;extension=php_cpdf.dll
・・・

使いたいdllの先頭の;を外す必要がある。

具体的に各鯖でどうなってるかはphpinfo()読めば大体わかるでしょう。
0243俺様03/03/11 12:05ID:+7fowk1S
まあ、重要な設定はこんなもんか?
後は上の日本語訳や
マニュアルにもけっこう説明がしてあるはずだから
それを読んでクレイ。
0244nobodyさん03/03/11 12:32ID:???
register_globals対策。

php3 -> php4で一番困るのが
register_globals

で、Sourceを手っ取りばやく移植するにはSourceの先頭で

$hoge = $_POST["hoge"];

ってな感じにする。
0245俺様死ね03/03/11 12:34ID:???
>>244
って言うか配列を変数に展開する関数みたいなの無かったっけ?
Perlだったっけか?
0246nobodyさん03/03/11 12:58ID:???
何だよここ、良スレ過ぎ!
回答ありがとう。

>>233
ググりかたが甘かったみたい。サンクスコ。
がんがってみます。
0247nobodyさん03/03/11 13:09ID:???
extract
0248俺様03/03/11 13:21ID:Aj/riikG
レッツPHPより引用

>■修正の仕方
>以前のスクリプトを、PHP4.1.0以降に対応させるには、
>以下の文を、最初の<?以降に挿入すると、暫定的に動作するかと思われます。
>extract($_GET);
>extract($_POST);
>extract($_COOKIE);
>extract($_SERVER);

>extract($_SESSION);←セッションを使う場合

>未確認なので動作は保証しません。extractは配列を変数に展開するための関数です($_GET[f]=2002なら$fに2002が入る)
0249nobodyさん03/03/12 22:56ID:???
phpをcgiとして使用した場合は

・Perl/CGIと比較して処理速度の高速化
・サーバー負荷の低減

これらのメリットは無くなるということですか?
0250俺様死ね03/03/13 11:13ID:???
>>249
そだね。CGIとしてPerlやCを動かすのと状況は同じ。
それでも俺的にはメリットは余りあるけど。
後、マルチすんなボケ。
0251俺様03/03/13 11:51ID:???
今日はいよいよDBについて書こう。ようやく使い方がわかってきたので。
PostgreでもMyでも使えるようにPearを用います。

対応DB
Interbase
Mini-SQL
Microsoft SQL Server
MySQL
Oracle 8 (OCI)
ODBC
PostgreSQL
Sybase

0252俺様03/03/13 11:59ID:???
まず準備としてphp.iniの設定が必要だ。

この3つを参照。
>>236
>>239
>>242

>>239、>>242はMySQLのみの場合は要らないかな。
例えばPostgreSQLを使いたければ
;extension=php_pgsql.dll
を
extension=php_pgsql.dll
ってする必要がある。
0253俺様03/03/13 12:09ID:???
MySQLのみインストール方法も書いておこう。

http://www.mysql.com/downloads/
ここからバージョンを選んで(勇気ない俺は4ではなく3.23)
Windows downloadsってのを落とす。
で、seteupを実行してnext連打でOK(一応要確認)。

インストールしたらc\:windows辺りにmy.iniってファイルが出来ていると思うので
それを開いてこれを追加。

[mysqld]
default-character-set=sjis

以上で完了だ。

PostgreSQLはcygwinを入れたりアカウント作ったりと面倒なので各自で調べてくれ。
何とかインストールできたけど数時間掛かった(汗
0254俺様03/03/13 12:11ID:???
ああ、後winmysqladmin.exeってのも
一度実行してユーザー名とパスを決めるように。
外部に公開しない場合はキャンセルでも良いでしょう。
0255俺様03/03/13 12:17ID:???
PHPにはいる前に単独での動作確認もしておきましょう。
DOSプロンプトで

C:\>mysql\bin\mysql
で、
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 50 to server version: 3.23.55-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

こんなふうになったら成功だ。
0256俺様03/03/13 12:24ID:???
Pearはここを参考。
http://pear.php.net/manual/ja/

調べたところによるとWindows用PHP4.3以降では
標準で付かなくなってしまったらしいので
上を参考に落としておきましょう。

0257俺様03/03/13 12:25ID:???
もちろん4.2以前から使ってた人は
最初からPearも使用できます。
0258俺様03/03/13 12:30ID:???
というか調べてるうちに(・∀・)イイ!サイト見つけたな。
これ見れば俺様の説明なんぞ用なしかも。
http://tsuttayo.sytes.net/mysql/index.html

これ見てphpMyAdminとかも入れておくと良い。
ブラウザからアクセスできるのでレンタル鯖などでも手軽に使えるのが特徴。
0259山崎渉03/03/13 17:01ID:???
(^^)
0260nobodyさん03/03/15 21:28ID:???
age
0261nobodyさん03/03/15 22:18ID:???
MySQL入れました。
最初、エラーが出て焦りました。
mysqladminいいかも。
0262nobodyさん03/03/19 23:10ID:???
つづきまだー
0263俺様03/03/19 23:51ID:???
>>262
何の話題がいい?
語るべきことは大体語っちゃったから
もう全てのPerlスクリプトを移植できるはずだ。
0264nobodyさん03/03/20 01:11ID:???
実践編が欲しいな。

なんかのコピペジェネレータを作るとか。

てかフォームを表示して受け取ってとかやってるとすんげー
HTMLとPHPのコードが入り乱れて汚くなっちゃうんだけど、どうすりゃいいの?
0265nobodyさん03/03/20 15:43ID:???
上でデータを作って下で表示させりゃいい。
<?

//極手抜き
$hoge = $_POST["hoge"];

?>
<HTML>
<H1><? print $hoge; ?></H1>
</HTML>

とか。
0266nobodyさん03/03/20 16:41ID:???
俺様殿江。ファイルとディレクトリの扱い方について解説して下さい。
0267nobodyさん03/03/20 16:59ID:???
Perl の Taint モードみたいのって、PHP にありますか?
0268nobodyさん03/03/20 19:10ID:???
Perlのexitや__END__みたいなヤシはありますか?
0269nobodyさん03/03/20 19:39ID:???
$fh = @fopen($file,"w");
の@はperlの何に相当するんですか?単にfopenじゃイクナイの?
0270nobodyさん03/03/20 20:28ID:???
>>269
@をつけると、エラー出力を抑止する。
つけなくてもいいけど、その場合はfopenに失敗したときにエラーがブラウザに返される。
0271nobodyさん03/03/20 21:50ID:???
>>270
ありが�d。
それじゃ代わりにperlみたいに
$fh = fopen($file,"w") or die("しぼんぬ");
ってやってもイイのかな。
0272nobodyさん03/03/20 22:09ID:???
>>271
いやだからそーすると、しぼんぬの前にエラーメッセージが出てしまう。

$fh = @foepn($file, "w");
if(!$fh){
 die("しぼんぬ");
}
0273nobodyさん03/03/20 22:15ID:???
>>272
なるほど。ありが�d�d
0274nobodyさん03/03/21 01:11ID:???
>>268
exitはexit()
__END__や__DATA__はないんじゃないかな
0275nobodyさん03/03/21 19:33ID:???
>>274
さんくす
0276nobodyさん03/03/25 14:18ID:CVcoKJbJ
メモ。

$a = $b || $c;

perl では、$b が false の場合は $c が $a に代入される。
php の場合は、 $a には $b || $c の bool値(0 or 1)が入る。
0277nobodyさん03/03/25 16:37ID:???
>>276
それJavaScriptでもできたなぁ。
■ このスレッドは過去ログ倉庫に格納されています