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

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

■ このスレッドは過去ログ倉庫に格納されています
0001俺様03/02/27 15:17ID:tJsRCtRD
見事Perl→PHPへの脱皮に成功した俺様が
両者の違いを中心に講義してやる。
今までPerlマンセーだったやつはこれを機にPHPに変更しよう也。
質問もガンガン書いてくれ。
このPerlの文はPHPだとどう書くの?とか。
0002nobodyさん03/02/27 15:19ID:???
このスレ結構ありがたいかも。
>>1
ありが�d
0003俺様03/02/27 15:19ID:tJsRCtRD
まず、両者には似てる部分も非常に多いというのは特徴だ。
例えば変数の宣言、初期化をしてみよう。
$foo = 0;
頭に$をつけるところも、型を特に指定する必要がないことも、
文末は;になることもみんな一緒だ。

ほら、簡単に移行できそうに思えてきただろ?
0004俺様03/02/27 15:31ID:tJsRCtRD
とりあえずHello, world!を出力してみるぞ。

<?
print "Hello, world!\n";
?>

printの意味はperlと一緒だ。
まあ、printよりecho使う人が多いがそんなに違いはない。
perlユーザならわかりやすい方が(・∀・)イイ!だろう。

プログラムの開始と終了は<?と?>で囲むんだ。
これはPHP特有だから早く覚えよう。
<?じゃなくて<?phpで囲んでもOK。将来XMLとの連携を考えるなら
後者で書く癖をつけたほうが良いとは言われている。
0005nobodyさん03/02/27 15:37ID:8ZVFA0UH
↓↓↓↓↓★ココだ★↓↓↓↓↓
http://www.pink-angel.jp/betu/index.html
0006nobodyさん03/02/27 15:39ID:???
PHPでrequireするファイルは必ず<?php ?>で囲まなきゃダメ?
0007俺様03/02/27 15:50ID:tJsRCtRD
とりあえずCGIじゃなくてmod_phpを使っていこう。
例えばCGI/Perlの場合、

#!/perl/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!\n";

簡単なテストスクリプトを書くときも2行目あたりのウザイのを
書く必要があったがmod_phpならそんな必要はない。
とにかく<?と?>で囲めばOKだ。

というわけで課題として、各自ローカルサーバにPHPをインストールしておこう。
PerlユーザならApacheはインストールしてあると思うのでそれを前提とすると、

http://www.php.net/downloads.php
上記サイトにある
Windows Binaries
PHP 4.3.1 zip package [5,853Kb]
を落とすのじゃ。下のPHP 4.3.1 installerの方が楽そうに見えるが
こっちはCGI/PHPとしてしか使えないから駄目。間違えるなよ。
0008俺様03/02/27 15:55ID:tJsRCtRD
>>6
どういう用途で用いるのか知らんが
PHPスクリプトをrequire()するなら当然
そっちも<? ?>は必要だぞ。

まあ、聞くより自分で確かめたほうが早いだろう。
0009俺様03/02/27 15:59ID:tJsRCtRD
PHPのインストールについては
詳しく解説しているところを見たほうが早いか。
始めたばかりの頃俺が参考にした所だ。

http://www.php-j.com/tutorial/install/win.php

では各自ローカルでPHPを動かせるようにしておきましょう。
その瞬間からPerlとはおさらばだ!
0010nobodyさん03/02/27 16:05ID:???
俺様、がんがれよ。
0011nobodyさん03/02/27 17:01ID:+18aFIzU
win用をインスコしたいのですが
ここ以外にバイナリって無いんですか?
http://www.php.net/downloads.php
0012俺様03/02/27 17:15ID:tJsRCtRD
>>11
そこのじゃ嫌なのか?
そこからで全然問題ないと思うが。
0013nobodyさん03/02/27 17:57ID:???
おお,このスレはありがたい.がんがってください.
0014nobodyさん03/02/27 18:00ID:oT8eTv8K
期待age
0015俺様03/02/27 20:27ID:tJsRCtRD
CGI/Perlの場合は
能や予、表などの漢字を使うときに文字化けしないように
\能、\予、\表みたいな面倒な書き方をする必要があっただろう。

PHPでは大半の人がEUCの日本語コードで記述していて
そのような必要はない。

と、言うわけでEUCを読み書き・保存できるエディタを用意しておきましょう。
例えば、Windows標準のメモ帳では無理です。

まあ、ベクターとかでEUCって検索すればすぐに見つかる。
http://channel.goo.ne.jp/download/search/search.php3?MT=euc&CD=1&SW=1&OS=3&category=1&search_num=10

シェアウェアのものでよいならば秀丸やEmEditorがお奨め。
0016nobodyさん03/02/27 21:11ID:???
質問なんですけど、
関数の引数にハッシュを使う方法ってありますか?
function func($key,$value){
return "$key => $value";
}
$result = func("key"=>"value");
みたいにやりたいのですが
Parse error: parse error, unexpected T_DOUBLE_ARROW
というエラーがでました。

function func($key=>$value){
return "$key => $value";
}
でも無理でした。
0017俺様03/02/27 21:36ID:tJsRCtRD
>>16
PHP固有の質問はこっちへ書き込もうぜ。

【PHP】質問スレッド Part7
http://pc2.2ch.net/test/read.cgi/php/1044478561/l50
0018nobodyさん03/02/28 04:10ID:???
(PerlCode)
$name="john";
$say=sub{return "My name is $_[0].";};
print &{$say}($name);

はPHPで書くとどうなりますか?
0019nobodyさん03/02/28 06:25ID:???
>>18
俺のPerl自慢。

                  つづく
0020nobodyさん03/02/28 08:36ID:???
>>18
<?php
$name = "jhon";
function say($name) {return("My name is $name");}
echo say($name);
?>
0021nobodyさん03/02/28 09:16ID:TC5rJBdj
そんなもんをXHTMLに埋め込んだら、見苦しくて死ぬぞ。
ブラウザでパースもできんようになるし。
MVCにしろや。
0022俺様03/02/28 10:31ID:???
>>20
お答えサンクス。

と、いうわけでもうインストールはばっちしだと思うので
今日はユーザー定義関数についてから話そう。
超独自仕様のPerとの大きな違いの1つだ。
まあ、はっきり言っちゃえば
>>18みたいな書き方はPerlではごく普通だが
Perl知らない人から見れば何なのかさっぱりってほど特殊だ。
それに比べてPHPの>>20は他の言語
(例えばJavaとか)しか知らない人が見ても何となく理解できるだろう。
00231803/02/28 10:35ID:???
>>20
レスどうもです。

無名サブルーチンみたいなのが使いたいなと思っていたのですが、
create_function関数というのがあるみたいですね。
http://www.php.net/manual/ja/function.create-function.php

<?php
$name="john";
$say=create_function('$name','return "My name is $name.";');
print $say($name);
?>
0024俺様03/02/28 10:51ID:???
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
return $_[0]+100;
}
$b= &foo(100)
print $b;;
#100 200
-------------------
function foo($a) {
print "$a ";
return $a+100;
}
$b= foo(100);
print $b;
#100 200

PHPの場合は明示的に引数を記述しておく必要がある。
可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。
まあ、こうやって見ると両方大した違いは無く見えるが
変数のスコープについて根本的な違いがあるので注意しよう。
それについては後述。
0025俺様03/02/28 11:03ID:0fBPA0cl
いちいち引数を書くとは面倒になったと言う人もいるだろうが、
おかげでデフォルト引数を簡単に実現できる。

<?php
function foo2($a ="俺様") {
print "$a は凄い<br>";
}
foo2("お前");
foo2();
?>

/*
お前 は凄い
俺様 は凄い
*/
引数を指定しなかったら勝手に俺様が凄くなってくれるのだ。
0026nobodyさん03/02/28 11:04ID:???
講座スレ作ろうとする奴って大体理論が崩壊してるよな・・・。
0027nobodyさん03/02/28 11:04ID:???
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
return $_[0]+100;
}
$b= &foo(100)
print $b;;
#100 200
-------------------
function foo($a) {
print "$a ";
return $a+100;
}
$b= foo(100);
print $b;
#100 200

PHPの場合は明示的に引数を記述しておく必要がある。
可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。
まあ、こうやって見ると両方大した違いは無く見えるが
変数のスコープについて根本的な違いがあるので注意しよう。
それについては後述。
0028俺様03/02/28 11:08ID:0fBPA0cl
これかいてる間に重要なこと思い出した。

#Perl code
$a=26;
print "$aゲット";

#26ゲット
-------------
#PHP code
$a=26;
print "$aゲット";

#(何も表示されない)
----------------------

両者にはこのような違いが起きてしまう。
下はどうすればよいのか各自考えてみましょう。

出かけるので解答は夜で。
0029俺様03/02/28 11:09ID:0fBPA0cl
26ゲットできなかったヽ(`Д´)ノ
0030俺様03/02/28 11:10ID:0fBPA0cl
>>26
俺様はPHP歴浅いので
崩壊どころか理論自体形成されていない。
だからこのスレタイは入門だ。
間違いはがんがん指摘してクレイ!
0031nobodyさん03/02/28 11:13ID:njt3nQcM
>>30
俺はPHPすら分からない。
だから、がんがん解説してクレイ!
0032nobodyさん03/02/28 11:19ID:???
結構見やすいPerl/PHPの構文比較のページ見つけました。

Perl/Php Translation
http://www.cs.wcupa.edu/~rkline/perl2php/

既出だったらゴメン。
0033俺様03/02/28 11:21ID:0fBPA0cl
>>32
それは便利だな。
では今後はそこに載ってないやつを指摘していくことにしよう。
0034nobodyさん03/02/28 11:25ID:???
>>18
<?php
$name = "jhon";
function say($name) {return("My name is $name");}
echo say($name);
?>
0035nobodyさん03/02/28 11:26ID:???
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
return $_[0]+100;
}
$b= &foo(100)
print $b;;
#100 200
-------------------
function foo($a) {
print "$a ";
return $a+100;
}
$b= foo(100);
print $b;
#100 200

PHPの場合は明示的に引数を記述しておく必要がある。
可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。
まあ、こうやって見ると両方大した違いは無く見えるが
変数のスコープについて根本的な違いがあるので注意しよう。
それについては後述。
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
0036nobodyさん03/02/28 11:32ID:???
>>28
変数名の後ろは全角文字でもダメみたいですね。
(半角の「.」はOKだった)

#PHP code
$a=26;
print $a."ゲット";

#26ゲット

#PHP code
$a=26;
print "$a.ゲット";

#26.ゲット
0037nobodyさん03/02/28 11:33ID:???
>>28
print "${a}ゲット";
print $a."ゲット";
echo $a,"ゲット";
0038nobodyさん03/02/28 12:12ID:???
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
return $_[0]+100;
}
$b= &foo(100)
print $b;;
#100 200
-------------------
function foo($a) {
print "$a ";
return $a+100;
}
$b= foo(100);
print $b;
#100 200

PHPの場合は明示的に引数を記述しておく必要がある。
可変引数は配列を渡せば良いだろう。Perlも実際は@_という配列を渡しているわけだし。
まあ、こうやって見ると両方大した違いは無く見えるが
変数のスコープについて根本的な違いがあるので注意しよう。
それについては後述。
Perlでは関数でなくサブルーチンと呼ばれていたな。

sub foo {
print "$_[0] ";
 
0039nobodyさん03/02/28 12:41ID:???
シフトJISでがんがん書いてます。
0040俺様03/02/28 20:06ID:R6lXT7Vm
>>36
  _n
 ( l    _、_
  \ \ ( <_,` )
   ヽ___ ̄ ̄  )   グッジョブ!! 
     /    /

>>37
   _、_
 ( ,_ノ` )      n
 ̄     \    ( E)  グッジョブ!!
フ     /ヽ ヽ_//

0041俺様03/02/28 20:12ID:R6lXT7Vm
些細なことに見えるが、
自分はこのせいで某スクリプトを
PerlからPHPに移植する際に、
30分ぐらい睨めっこした記憶があるので。
頭の中に入れて起きましょう。

$a=26;
print "{$a}ゲット";
print $a."ゲット";
0042nobodyさん03/03/01 11:16ID:5K/2+grl
先生質問です。
>>9の通りしましたがapacheが起動できません。
どうやらhttpd.confのLoadModule php4_module C:/php/sapi/php4apache.dllが原因のようです
php4apache.dllをphp4apache2.dllとしても同じでした。

WinME Apache2.0.39です
0043nobodyさん03/03/01 11:44ID:???
>>42
OS側類。
0044俺様03/03/01 12:12ID:UE12tRyA
>>42
Apacheは2よりも1.3.27の方がいいと思う。
後はなんだろな〜
Meなんて怪しいOS使ったことないからな。
とりあえずApacheのバージョンを変えて試してみてクレイ。
0045nobodyさん03/03/01 12:41ID:5K/2+grl
>>44
ありがとうございます。1.3.27を使ったら起動できました。
0046nobodyさん03/03/01 16:35ID:???
 |  | ∧
 |_|Д`) < それだー!!
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄ ̄
 |  | ∧
 |_|Д`) < それだー!!
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄ ̄
 |  | ∧
 |_|Д`) < それだー!!
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄ ̄
 |  | ∧
 |_|Д`) < それだー!!
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄ ̄
 |  | ∧
 |_|Д`) < それだー!!
 |文|⊂)
 | ̄|∧|
 ̄ ̄ ̄ ̄ ̄
0047nobodyさん03/03/01 16:36ID:???
>>44
OS = Windowsとか思っている痛い講師がいるクソスレはココですか。
0048俺様03/03/01 17:05ID:UE12tRyA
>>47
世の中は理詰めだけでは解決しない。
理論ヲタになるより、わかりやすさを求める方が現実的だ。
わかるかい?
しかも、PHPと直接は関係ない。
君は文学者がテイラー展開を出来なかったら馬鹿にするだろうか?

では、今日はいよいよ変数のスコープについての説明だ。
あくまでも対象者は基本的に『Perlしか』やったことがない人のみ。
C言語など他の言語をやっている人には馬鹿見たく思われる説明になるからだ。
0049nobodyさん03/03/01 17:07ID:???
>>48
>君は文学者がテイラー展開を出来なかったら馬鹿にするだろうか?

少なくとも数学者を目指す文学者がマクローリン展開を知らなければバカにするが。
0050俺様03/03/01 17:30ID:UE12tRyA
>>49
俺様はべつにオペレーティングシステムのエキスパートを目指してはいないッポ。

#Perlscript

sub foo{
$a = 100;
print "$a,";
$a++;
}

&foo();
print $a;

#100,101

まあ、当たり前の結果が表示されます。
これをPHPに書き換えてみましょう。
0051俺様03/03/01 17:34ID:UE12tRyA
#PHPscript

<?php
function foo(){
$a = 100;
print "$a,";
$a++;
}

foo();
print $a;

?>
# 100,

何故か100しか表示されません!?( ̄□ ̄;)ナント!!
どうして後ろの$aは表示されなかったのでしょうかという問題です。
0052俺様03/03/01 17:41ID:UE12tRyA
同様の例です。

#Perl

sub hoge{
print $a;
}
$a="俺様";
&hoge;
----------
#PHP

function hoge(){
print $a;
}
$a="俺様";
hoge();

Perlの方だと見事、俺様と表示されるのですが、
後者の方は何も表示されないので吃驚仰天です。
0053nobodyさん03/03/01 17:47ID:???
>>50
>俺様はべつにオペレーティングシステムのエキスパートを目指してはいないッポ。

いや、エンジニアでなくても車=ベンツとか思ってる奴はアホなわけで。

教養ではなく常識なのよ。常識。
0054nobodyさん03/03/01 18:26ID:???
>>53
邪魔。キエロ
0055nobodyさん03/03/01 18:33ID:???
>>54
どうしていつものコテハンを使わないんですか?
0056nobodyさん03/03/01 18:58ID:???
>>55
ごめんごめん。かんじよめないんだ?
ジャマ。キエロ
0057俺様03/03/01 19:04ID:UE12tRyA
>>54,>>56
(・∀・)カエレ!!
せっかくこのスレを良い感じにしたいのだから
煽りはよそでやってクレイ。
0058俺様03/03/01 19:06ID:UE12tRyA
>>53
まあ、教養が無かった俺様が厨ってことで
その話題は終わりにしよう。スレ違いだし。
0059nobodyさん03/03/01 19:09ID:xu/mDseR
↓↓↓↓↓★ココだ★↓↓↓↓↓
http://www.pink-angel.jp/betu/linkvp/linkvp.html
0060nobodyさん03/03/01 19:29ID:???
>>50-51
Perlがデフォルトでグローバル変数なのに対して、
PHPでは、デフォルトでローカル変数だから。

#PHPscript
<?php
function foo(){
$a = 100;
print "$a,";
$a++;
}
foo();
print $a;
?>
は

#Perlscript
sub foo{
my $a = 100;
print "$a,";
$a++;
}
&foo;
print $a;

と同じ
#始めたばかりなので全く同じかどうかとか用語の使い方は正しくないかもしれません
0061nobodyさん03/03/01 19:56ID:???
#PHPscript
<?php
$a = 999;
function foo(){
$a = 100;
print "$a,";
$a++;
}
foo();
print $a;
?>
#100,999

なーる。
0062俺様03/03/01 19:58ID:gsC9ephA
>>60
(*゚▽゚ノノ゙☆パチパチ

Perlにおいていわゆるmyを付けた場合が
PHPでは標準になっています。
C言語などの場合はコンパイル時に
未定義(未宣言)の変数だ!ってエラーを出してくれるのですが、
PHPではそのまま初期値(文字なら空白、数字なら0)として
認識してしまうので注意しましょう。

結構すんなり受け入れられるのかなー?
普段からmyを使ったりしている人なら問題ないだろうけど
プログラミング言語をPerlしかやってないでグローバルなのが当たり前だって
思ってた人には受け入れるのに時間が掛かるかもしれない。

そんなことないか?どうだろう。
0063nobodyさん03/03/01 20:01ID:Ddm3hU+C
Perlってなんて読むの?
0064俺様03/03/01 20:08ID:gsC9ephA
逆にPerlの標準のようにグローバル(大域)変数として
扱いたい場合も書いておきましょう。
これはCやJavaとも違う仕様ですね。
関数内の最初でglobalと宣言します。
なお、PHPの設定でregister_globalsをonにすると
また違うようなのですが、デフォルトはoffで推奨となっているのでそれに従います。

<?php
$a = 999;
function foo(){
global $a; //これでグローバルスコープの$aを参照しますよと宣言している。
print "$a,";
$a++;
}
foo();
print $a;
?>
#999,1000

因みに、function foo()はどこに書いてもOKです。
(PHP3だったころは駄目だったとか・・・)

>>63
[p:(r)l]
0065俺様03/03/01 20:25ID:UE12tRyA
Perlには静的(スタティック)変数が無かったと思うので
それについても書いておきましょう。

function foo(){
static $a=0;
print $a;
$a++;
}

for($i=0;$i<5;$i++){
foo();
}

#01234

このようにすると
最初にfoo()が呼ばれたときのみstatic $a=0が呼ばれてくれるのです。
以降、foo()が呼ばれるたびに$aは1ずつ増加してくれます。
staticをつけないと毎回0が出力されてしまいますね。
変数のスコープは関数内のみなのに値を保持していてくれるわけです。
globalでは無いので関数外部から直接$aの値をいじることは出来ません。
0066生徒B03/03/01 20:39ID:???
perlの use strict; のような未定義変数をチェックする方法はPHPに無いのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています