X



【待望】PerlユーザのためのPHP入門
0001俺様
垢版 |
03/02/27 15:17ID:tJsRCtRD
見事Perl→PHPへの脱皮に成功した俺様が
両者の違いを中心に講義してやる。
今までPerlマンセーだったやつはこれを機にPHPに変更しよう也。
質問もガンガン書いてくれ。
このPerlの文はPHPだとどう書くの?とか。
0399nobodyさん
垢版 |
03/07/26 02:18ID:???
改行コードCRLFで保存したファイルを
配列で1行づつ配列で取り出して保存したいんですが、
何故かPHPだと改行コード(CRCR...LF)と増え続けます。
改行コードの仕様の問題なんっすかねぇ?

# Perl
open( IN , "hoge.dat" );
@lines = <IN>;
close( IN );
#何か処理
open( OUT , ">hoge.dat" );
print OUT @lines;
close( OUT );

// PHP
$lines = file( "hoge.dat" );
// 何か処理
$fp = fopen( "hoge.dat" , "w" );
foreach( $lines as $line ){
 fputs( $fp, $line );
}
fclose( $fp );
0401nobodyさん
垢版 |
03/07/26 03:36ID:???
>>400
バイナリモードで開く"wb"(WINのみ)
$fp = fopen( "hoge.dat" , "wb" );
とすると一応解決しますね。サンクスです。
根本的な解決になってるのかどうか微妙っす。
0402nobodyさん
垢版 |
03/07/26 04:30ID:???
>>401
テキストモードで開くと
fputs などの出力処理中に \n が見つかった際に
内部で \r\n に置き換えるという小さな親切を行ってくれます

バイナリモードならそれをやらないので解決だと思われまする
0403402
垢版 |
03/07/26 04:33ID:???
うーん、でも読み込む際も CRLF⇒LF 変換やってくれたような?
まあいいや。たぶん大丈夫。
0404nobodyさん
垢版 |
03/07/26 16:31ID:???
>内部で \r\n に置き換えるという小さな親切を行ってくれます
なるほそ。小さな親切ですね・・・
0405nobodyさん
垢版 |
03/07/28 20:34ID:MPvwsvte
perlで、書き込み処理を終えたあとに他のページに飛ばすとき、
print "Location:./santa.cgi?$no\n\n";
exit;
などとしていましたが、phpでこれと同等なのはどういうコマンドでしょうか?
コマンド名だけでも良いので助言お願いします。
0407nobodyさん
垢版 |
03/07/29 00:10ID:???
header("location: ./santa.php?no");
でどうでしょう。
0408nobodyさん
垢版 |
03/07/29 00:53ID:???
locationは絶対パスで指定しなよ…
0409nobodyさん
垢版 |
03/07/29 01:11ID:???
どっちでも同じでしょ。
相対だと不都合でるブラウザってあるの?
0415nobodyさん
垢版 |
03/07/31 09:22ID:???
○ index.html
× ./index.html
ってのが前あった。
0416山崎 渉
垢版 |
03/08/02 02:23ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0417ぼるじょあ ◆ySd1dMH5Gk
垢版 |
03/08/02 04:51ID:???
     ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ ) <これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
  = ◎――――――◎                      山崎渉&ぼるじょあ
0418nobodyさん
垢版 |
03/08/03 03:36ID:e6CW3yAE
良スレ
あげとく
0419nobodyさん
垢版 |
03/08/15 21:51ID:/UWm9DVh
PHPユーザーのためのPerl入門だれか立ってってくれ!
0420山崎 渉
垢版 |
03/08/15 22:25ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0421nobodyさん
垢版 |
03/08/28 08:28ID:aKTRoIJT
PHPでOOPでもと思い、

Perl
use lib './lib/';
use Hoge;

PHP
define( 'LIB_DIR', './lib/' );
include( LIB_DIR . 'Hoge.class.php' );

とやってるんだけど、もうちっと短く書きたいなぁ。
0422nobodyさん
垢版 |
03/08/30 22:41ID:AS3I0NRv
Perlやってた奴が、PHPを勉強するのにいい本って何?
PerlでいうところのプログラミングPerlみたいな
大御所のこれさえ買っとけばたいてい載ってるって本きぼん。
0424nobodyさん
垢版 |
03/08/31 13:22ID:AiCjBA+L
>>422
赤マンモス
0425nobodyさん
垢版 |
03/09/07 01:36ID:???
HTML::Template, DBI に替わるものがPHP覚える気になるんだけど。
プログラム中にHTML書いてあったら落ち着かない
0426nobodyさん
垢版 |
03/09/07 01:56ID:1pDZ49hH
0427nobodyさん
垢版 |
03/09/10 00:04ID:EKqTJkq7
検索について教えて下さい。
perlで検索で、$find_lineの中に、$f_a_wordが含まれているかを
if (index($find_line,$f_a_word) >= 0) {
 含まれている
} else {
 含まれていない
}
このようにしていたのですが、phpだとどのようになりますか?
0428427
垢版 |
03/09/10 00:42ID:???
427です。eregというので出来そうです。
失礼しました。
0429nobodyさん
垢版 |
03/09/10 01:08ID:???
>>425
これじゃだめかな?
やってみてくりくり


<?php

$find_line = "これはテソトです。";
$f_a_word = "テソト";

if(strstr($find_line,$f_a_word)){
echo '$find_lineの中に$f_a_wordは含まれています!';
}
else{
echo '$find_lineの中に$f_a_wordは含まれていません!';
}

?>
0430429です
垢版 |
03/09/10 01:20ID:z4dT6uSf
番号ずれてますたスマソ。
427-428宛のレスです。

OpenJaneって番号ズレるのね。。。
0431 
垢版 |
03/09/10 04:03ID:???
strstr();ってi18n対応?
0432nobodyさん
垢版 |
03/09/10 10:21ID:???
mb_strpos()とかじゃだめかい?
0433nobodyさん
垢版 |
03/09/11 23:16ID:???
>>421
> PHPでOOPでもと思い、

インクルードパスの設定とOOPには何の関係もない。
‥‥‥というのはともかく、auto_prepend でググれ。
0434nobodyさん
垢版 |
03/09/20 14:31ID:???
ここ、一昨日初めて来たんだけど良スレだね。
おかげで分からなかった事も分かりました。ありがd
0435nobodyさん
垢版 |
03/09/20 22:34ID:VeIFc9WR
あるディレクトリの一覧をファイル名順でソートしたいと思います。
ただし、.や..や.htaccessといった、「.」で始まるファイルは対象外にしたいのです。

Perlで
---
opendir(DIR, $path);
@list = sort grep(!/^?./, readdir(DIR));
closedir(DIR);

と書くところを、phpではどのように表現すればよいのでしょうか?
0437とおりすがり
垢版 |
03/09/21 03:57ID:???
>>435
自信ないが
$dh = opendir($path);
while ($tmp = readdir($dh)) $filename[] = $tmp;
$filename = preg_grep("/^[^\.]/", $filename);
sort($filename);
closedir($dh);
0439nobodyさん
垢版 |
03/09/22 04:27ID:PmE0lLf0
>>437-438
なるほど。このコード実行してないんであれですが、
preg_grep する前に $filename[] = $tmp しちゃうと、
配列$filename内には「.」や「..」が残りそうな雰囲気が…違ったらごめん。
こんな感じにしてみました。
---
if( false !== ($handle = opendir($query_path)) ){ //ディレクトリが開けるなら
while( $file = readdir($handle) ){
if( preg_match ("/^?./", $file) ){
$files[] = $file;
}
}
closedir($handle);
if( count($files) >= 1 ){
sort($files);
}else{
print "このディレクトリ内に読めるファイルはありません?n";
}
}


つーかnatsortって便利ですな。
http://search.net-newbie.com/php/function.natsort.html
0440 
垢版 |
03/09/22 05:52ID:???
>437のでOKでは。>439は正規表現が意味不明になってるよ。

正規表現が分からない時はこんなのもアリかな。

while ( $entry = readdir($dh ) {
  if ( substr($entry, 0, 1) != '.' )
    $files[] = $entry;
}

http://jp.php.net/substr
0441 
垢版 |
03/09/22 06:08ID:???
ああ全角か。スマソ。
0442nobodyさん
垢版 |
03/09/22 11:22ID:???
全角でもオレには意味不明なんだが・・・
0443nobodyさん
垢版 |
03/09/22 16:10ID:???
分からなかったら聞きましょうね♪
0445nobodyさん
垢版 |
03/09/25 23:55ID:???
perlのflock関数だったらさんざん使ったことあるんですが、
perlの場合のflock関数と比較して、
phpのflock関数を使うときの注意点って、特になんか、ありますか?

(ウェブサーバは、Apacheという前提です)
0446445
垢版 |
03/09/28 00:48ID:lxnHIT50
どなたかお答えくださいませ
0447nobodyさん
垢版 |
03/09/28 02:01ID:???
lockはlock専用スレがありまっせ。
0448nobodyさん
垢版 |
03/09/28 02:26ID:???
>>445
にたようなもんじゃないのかな?
たしか、PHPマニュアルにもflock関数は全ての環境で使えるもんじゃ
ないみたいなこと書いてあったし、
ネットワークファイルシステムに対応してないけりゃ、無理だろうし。
ちなみに、うぇぶさばは関係ないですぞ。
0449445
垢版 |
03/09/28 03:46ID:???
>>447
ども。のぞいてきます。

>>448
そうですね。
よく考えりゃ、どっちもOSのflockを呼び出してるってことだから、
特段変わることはないか。。。

>ちなみに、うぇぶさばは関係ないですぞ。
いや、マニュアル
http://www.php.net/manual/ja/function.flock.php
に、
「いくつかのオーペレーティングシステムでflock() はプロセスレベルで実装されています。
ISAPIのようなマルチスレッド 型のサーバーAPIを使用している場合、
同じサーバーインスタンスの並 列スレッドで実行されている他のPHPスクリプトに対してファイルを保 護する際に
flock()を使用することはできません」
って書いてあったから、
ウェブサーバにIIS使ってると、事情が違うのかなと思って一応かいといたもんで。。。
(正直IIS分からんですが)
0451445
垢版 |
03/09/28 22:34ID:jyRnC+If
>>450
あれ、なんかとぼけたこと自分言ってました?

ご指摘きぼんぬ
0452nobodyさん
垢版 |
03/09/29 10:34ID:???
通りがかりだが
あまり気にする事は無いかと

マルチスレッド型を利用している場合、別々に動作している
phpは同一プロセス(の、別スレッド)で動作している事になるので
プロセス単位で排他をかけるflock()は排他の目的には使えない
ということで、HTTPdとphpの組み合わせによる、というのは正しいかも
0454nobodyさん
垢版 |
03/10/07 23:44ID:???
$str =~ s/◆/◇/g;
みたいなマルチバイト文字列の置換をPHPでやるにはどうしたらいいんでしょうか。
mb_ereg_replaceはまだ実験段階らしいのであまり乗り気ではなく。
0455nobodyさん
垢版 |
03/10/08 00:11ID:???
>>454
str_replaceでも「とりあえずは」OK。
それか、文字列をUTF-8に変換してから
$str_utf8 = preg_replace("/pattern/u", "replace", $str_utf8);
でもOK。

ただしmb_ereg_replaceはライブラリのライセンス絡みでもめてたけど
関数自体は十分実用に耐えるよ。
ライブラリの変更はPHP5で行われ、ユーザレベルでの変更は
不要になる方向らしいから気にすることは無いと思うけど。

ちなみにmb_ereg系を使うときはmb_languageとmb_internal_encodingを
ちゃんと設定していないと駄目。
0456454
垢版 |
03/10/08 00:30ID:???
>>455
詳細なレスありがとうございます。
試しにpreg_replaceを使った時えらく文字化けしたのでなんでだろと疑問だったんですがこれで解決しました。
一応マルチバイト文字列関数用にphp.iniの設定は書き変えてあるので、
mb_ereg_replaceを使っても将来的に問題ないということならこれでいこうかなと思います。
0457nobodyさん
垢版 |
03/10/18 23:15ID:???
配列をpackする時ってどうすんの?
他にも$a,$b,@c,$d,…と並べて@cの内容が展開されるようにしたい時とか.
0458nobodyさん
垢版 |
03/10/27 17:51ID:???
既出かもしれませんが、
http://www.din.or.jp/~ohzaki/perl.htm
をPHPにコーディングしなおしたサイトを誰かしりません?
無いかなー。
0459nobodyさん
垢版 |
03/10/28 18:22ID:???
 $a="abcdABCD";
 $a =~ tr/[a-z][A-Z]/[A-Z][a-z]/;
 print "content-type:text/html\n\n";
 print "$a";

上のコードをPHPに移植し、

 $a="abcdABCD";
 $a=strtr($a, "[a-z][A-Z]", "[A-Z][a-z]" );
 echo $a;

と書いてみたところ、strtr()で正規表現が使えないようなのですが
何か良い方法はないですか。
0460nobodyさん
垢版 |
03/10/29 23:14ID:dIX7j6Ca
perlだと、csvファイルに対してSQL文を投げられる、SQL.pmっていうのがあるんですが、
phpでそういうモジュールってないでしょうか?
(いやぁ、ほんとはDB使いたいんですけどね。。。わけあってつかえず)
0461nobodyさん
垢版 |
03/11/01 14:03ID:5TPcc+Om
連休中にphp勉強したいぞーage
0462nobodyさん
垢版 |
03/11/01 14:49ID:???
>>459
泥臭いけど・・
$a = 'abcdABCD';
$from = implode('',array_merge(range('a','z'),range('A','Z')));
$to = implode('',array_merge(range('A',Z'),range('a','z')));
echo strtr($a,$from,$to);

rangeを使って配列をつくってarray_mergeで配列合体させて
implode(perlでいうところのjoin)で文字列にして置換ってかんじ
連続する文字コードならrangeでいけるよね
0463nobodyさん
垢版 |
03/11/03 00:41ID:4CVQMxAy
perlでいうところの、

print qq|
 $hoge
<hr>
<a href="http://www.yahoo.com"></a>
|;

みたいの、phpでないでしょうか?

要は、変数展開もされて、”もエスケープする必要がないように書きたいのですが・・・
0464nobodyさん
垢版 |
03/11/03 00:44ID:???
$a =~ tr/[a-z][A-Z]/[A-Z][a-z]/;

なんか無駄がないか?
0466nobodyさん
垢版 |
03/11/07 15:11ID:GoKF/NUR
$a = 2;
switch($a) {
 case "1" : global $b = "one";
 case "2" : global $b = "two";
 case "3" : global $b = "three";
}
echo $a." -> ".$b;

みたいなことをやりたいのですが、switch文では無理ですか?
if,elseif...なら可能なのですが…
0467nobodyさん
垢版 |
03/11/07 15:40ID:???
>>466
それを実行すると1〜3のどれを$aに入れても$bが"three"になっちゃう

各分岐のお尻にbreak;付けましょうね
switch($a) {
 case "1" : $b = "one"; break;
 case "2" : $b = "two"; break;
 case "3" : $b = "three"; break;
}
0470463
垢版 |
03/11/12 04:51ID:FrBzA+Qu
>>465
ありがとうございます。

そういえば、php4からヒアドキュメント使えるようになったんですよね。
(php3の知識はあっても、4の知識はあまりないもんで)

ヒアドキュメントで逝ってみます。

ただ、print qq|ほげー|;の手軽さが、なれてしまって、ラクなんですけどね。。。
ともかく、ありがとうございました。

0471nobodyさん
垢版 |
03/11/12 05:09ID:???
my $xやvar xみたいな変数の宣言をする方法はないのでしょうか?
0472nobodyさん
垢版 |
03/11/12 06:00ID:???
>>471

↓このへんわかりやすいんちゃう?
http://itbtech.itboost.co.jp/php/php_01.php

<引用>
PHP の変数は宣言がありません。
また、明示的に型の指定をしてやる必要もありません。
この辺は Perl と同じです。
必要に応じてキャスト(相当のこと)を行うことはできます。
</引用>
0473nobodyさん
垢版 |
03/11/12 17:05ID:???
Perlで$a |= "default a";
という書き方を多用していたのですが、
PHPでは$a = !isset($a) ? "default a" : $a;
でよろしいのでしょうか?
0474nobodyさん
垢版 |
03/11/12 20:14ID:???
$a ||= "default a";
なら、
$a || ($a = "default a");
$a or $a = "default a";
とか。

$a |= "default a";
はそのままで通る。
(perl/PHP共に期待したものではないと思うけど)
0475473
垢版 |
03/11/12 21:19ID:???
>>474
すみません、先ほどは$a ||= "default a";
のことを言っておりました。
で、$a || ($a = "default a");
ですと、$aが未定義の場合、undefined errorが出てしまいます。
(当方error_reporting = ALLにしています)
0476nobodyさん
垢版 |
03/11/12 21:56ID:???
>>475
isset($a) || ($a = "default a");
これでどう?

厳密にはこうだろうけど、
(isset($a) && $a) || ($a = "default a");
長すぎ。

# PHP的には、先にデフォルトを設定するものだと思ってた。
# PHPのエロイ人plz。
0477473
垢版 |
03/11/12 22:08ID:???
> isset($a) || ($a = "default a");
これなら問題なく実行できました。この書き方が一番スマートそうですね。
0478nobodyさん
垢版 |
03/11/12 22:08ID:???
GETのパラメータ区切りに&じゃなく;を使うにはどうしたらよいのでしょうか?
0480nobodyさん
垢版 |
03/11/26 02:30ID:???
俺様帰ってこないかな
別に用は無いんだけど
0481俺様
垢版 |
03/12/05 23:06ID:???
>>480
この板はしばしば見ているぞ。
最近はperl2phpのコンテンツを立ち上げてがんばっているところだ。
0482nobodyさん
垢版 |
03/12/12 00:39ID:???
>>481
perl2php期待してます。
php勉強してるので…
0484nobodyさん
垢版 |
03/12/14 00:06ID:???
ソケット通信をする際、相手方のIPアドレスがわかっている場合、
fsockopenの第一引数にIPアドレスを入れれば、
内部的に名前の解決をしなくて済むのでしょうか?
0485nobodyさん
垢版 |
03/12/14 21:20ID:???
>>484 ttp://jp.php.net/fsockopen
IP address がすでにわかってるのに名前の解決?
Ip address => name なら、そもそも必要ない。

fsockopen関数の内部で、PHPが名前え解決するかどうかとういう話であれば、
inet_aton が失敗すれば(第一引数のhostが IP address を表す文字列でない場合)、
名前の解決(gethostbyname)がされる様です。
0486nobodyさん
垢版 |
03/12/14 23:41ID:???
>>485
>fsockopen関数の内部で、PHPが名前え解決するかどうかとういう話であれば、
>inet_aton が失敗すれば(第一引数のhostが IP address を表す文字列でない場合)、
>名前の解決(gethostbyname)がされる様です。

なるほど、ありがとうございます。
大変参考になりました。
0487486
垢版 |
03/12/17 00:08ID:???
IPアドレスでfsockopenと、リモホでfsockopenとで、
処理にかかる時間を比べたんですが、
前者の方が多少遅い結果になりました。
perlの場合とはやはり違うのでしょうか…?
0488nobodyさん
垢版 |
03/12/18 13:37ID:SDZbq9mq
perlでいうtr/a-zA-Z//c(a-zA-z以外にマッチして置き換える)
っていうのはPHPではどう書けば良いでしょうか?(´・ω・`)?モニュ
小一時間探したけど見つかりませんでした
0489nobodyさん
垢版 |
03/12/18 13:59ID:SDZbq9mq
やりたいことは、リストに含まない文字が
検出されたらエラーを表示させる事です。

perlだと
if(($_ =~ tr/a-zA-Z0-9//c) {
die 'リストに含まれない文字が検出されたYO!';
}
な感じでそれをPHPでやりたいです。
0491nobodyさん
垢版 |
03/12/18 16:46ID:???
>487
どうせろくでもないベンチスクリプトだろ

>488
既出

>789
!
0492nobodyさん
垢版 |
03/12/18 20:33ID:???
>>489
$str = ...
if (ereg("[^a-zA-Z0-9]", $str)){
die('リストに含まれない文字が検出されたYO!');
}

多分"[^[:alnum:]]"でも。
0493nobodyさん
垢版 |
03/12/18 20:37ID:???
そういうことじゃないと思う。
0494nobodyさん
垢版 |
03/12/21 18:56ID:16zntf/g
>492

ぇ?ネタですか?(´・ω・`)?モニュ

-zA-Z0-9にマッチでエラー表示
じゃないでつ。文字列中に例えば
記号が入ってたらエラーにする処理でつ。

0495nobodyさん
垢版 |
03/12/21 20:52ID:???
ネタ?
491のでええやん。elseでもいいし。
0496492
垢版 |
03/12/21 21:11ID:???
>>494
a-zA-Z0-9 *以外* の文字にマッチしたらdieしますが、違うのですか?
レスを投稿する


ニューススポーツなんでも実況