Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

PerlerのためのPHP2

続き。

初めてのPHP5

初めてのPHP5


そういえばtrueとfalseが抜けていた。
つーか「===」って何よ。
調べた。
PHP: PHP 型の比較表 - Manual
ここの表が全てかな。

<?php
if (1 == true) {
  print "ok[1==true]\n";
}
if (1 === true) {
  print "ok[1===true]\n";
}
if (1 === 1) {
  print "ok[1===1]\n";
}
?>
ok[1==true]
ok[1===1]


では続き。

多次元配列

Perl
@array = (
  [ 'a',  'i',  'u',  'e',  'o'],
  ['ka', 'ki', 'ku', 'ke', 'ko'],
  ['sa', 'si', 'su', 'se', 'so'],
);

Perlでは厳密には多次元配列ができなくて、代わりに配列のリファレンスを要素として擬似的に多次元配列を実現している。

PHP
<?php
$array = array(
  array( 'a',  'i',  'u',  'e',  'o'),
  array('ka', 'ki', 'ku', 'ke', 'ko'),
  array('sa', 'si', 'su', 'se', 'so'),
);
?>

PHPではそもそもがPerlでいうところのスカラで配列を表現しているから、Perlより多次元であることが分かりやすいと思った。


多次元配列の要素にアクセス。

Perl
print $array[1]->[1]; #=> ki
# or
print $array[1][1];   #=> ki
PHP
<?php
print $array[1][1]; #=> ki
$array[1][] = 'ga'; # push
print $array[1][5]; #=> ga
?>

関数記述

Perl

sub をサブルーチン名の前につける。

PHP

function を関数名の前につける。

関数呼び出し

Perl
ppp();
sub ppp {
  print "ppp\n";
}
ppp;

サブルーチンより前なら「()」は必須。
後ろならなくてもいける。

PHP
<?php
ppp();
function ppp() {
  print "ppp\n";
}
ppp();
?>

関数宣言より前でも後でも「()」は必須。

引数

Perl
sub ppp {
  my ($m, $n) = @_;
  print "\$m => $m, \$n => $n \n";
}
ppp('1st', '2nd');
#=> $m => 1st, $n => 2nd
PHP
<?php
function ppp($m, $n) {
  print "\$m => $m, \$n => $n \n";
}
ppp('1st', '2nd');
#=> $m => 1st, $n => 2nd
?>

PHPの引数のスコープはその関数内で消えるので、これで上のPerl版と全く同じ。

引数値がなかったらのためにデフォルトを用意

Perl
sub ppp {
  my $m = shift @_ || 'First';
  my $n = shift @_ || 'Second';
  print "\$m => $m, \$n => $n \n";
}
ppp('1st');
#=> $m => 1st, $n => Second
PHP
<?php
function ppp($m = 'First', $n = 'Second') {
  print "\$m => $m, \$n => $n \n";
}
ppp('1st');
#=> $m => 1st, $n => Second
?>

デフォルト引数に関しては、PHPは最初に用意しておく変数に代入する形をとる。
うーん、なんかここだけ見ると、最初にこれを代入して始めます、みたいに見えて少し迷いそう。


また、Perlでもそうだけど、引数の順番は絶対なので、PHPのデフォルト引数設定は「3個の内の2個目だけ」はできない。

<?php
function ppp($m, $n = 'Second', $o) { // これはできない
}
?>

引数はなに渡し?

Perl

Perlは変数渡し。

$word = 'aiueo';
sub ppp {
   $_[0] = 'kakikukeko';
}
print $word; #=> aiueo
ppp($word);
print $word; #=> kakikukeko
PHP

PHPは値渡し。

<?php
$word = 'aiueo';
function ppp($w) {
  $w = 'kakikukeko';
}
print $word; #=> aiueo
ppp($word);
print $word; #=> aiueo
?>

参照渡しには「&」を使うらしいけれど、まだそこまでいってない(僕が)。


参考:「引数 - Wikipedia

返却値

return。

関数内でグローバル変数にアクセス

Perl
our $aaa = 'our_aaa';
sub ppp {
  my $aaa = 'my_aaa';
  print $aaa,"\n";
  print $main::aaa,"\n";
}
ppp;
#=> my_aaa
#=> our_aaa

our でパッケージ変数にして、それをフル変数名で呼び出すみたいな。

PHP
<?php
$aaa = 'global_aaa';
function ppp() {
  $aaa = 'infunc_aaa';
  print $aaa;
  print $GLOBALS['aaa'];
}
ppp();
#=> infunc_aaa
#=> global_aaa
?>

すごく、no strict "refs"; したくなります。


もうひとつPHPには、グローバルであることを示す「globalキーワード」なるものがあるけれど、

一般的に筆者がお勧めするのは、globalキーワードのかわりに関数内のグローバル変数にアクセスする$GLOBALS配列を使うことです。$GLOBALSを使うとグローバル変数を処理していることをどの変数のアクセスにも合図してくれます。
P.81

ということらしいので、こちらで覚えよう。


ついでに引用。

$GLOBALS配列は、関数内で使われても関数外で使われても、常にスコープの中にあります。これは$GLOBALSがオートグローバルと呼ぶ前もって定義された特別な種類の変数だからです。
P.81

なるほどなー。固定かな。


環境変数

Perl

%ENV。

PHP

$_SERVER。



その2でもまだ全然だなー。