Perl日記

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

PerlerのためのPHP1

たぶんPHPを使わなければならないようになると思うので、今のうちから勉強。
ああCatalystでもっと遊びたい。
とりあえずこれを買った。

初めてのPHP5

初めてのPHP5


読んでるけど忘れないうちに以下メモ。

開始と終了

Perl
#!/usr/local/bin/perl
CODE
__END__

ENDマーカはあってもなくても。

PHP
<?php
CODE
?>

「< ?php」と「?>」で囲んだところがPHPコードとして解釈される……、と思ったけど、ライブラリ的に書くときは「?>」をつけないらしい。
参考:「PHP基礎文法最速マスターの補足 - モノノフ日記
Perlだとあの「1;」をつけないといけない、あたりに該当すると思う。

大文字小文字

Perl
print "ok\n"; #=> 動く
PRinT "ok\n"; #=> 動かない

sub test { print "ok\n"; }
test(); #=> 動く
TeSt(); #=> 動かない
PHP
<?php
print "ok\n"; #=> 動く
PRinT "ok\n"; #=> 動く

function test() { print "ok\n"; }
test(); #=> 動く
TeSt(); #=> 動く
?>

なんと!
Perlから覚えた人間(まあ僕だけど)にしてみればすごい違いだと思った!
関数に大文字小文字の違いがないとは。
……まあこれを利用して何かする気にはなれないけれど。

コメント

Perl
# 1行コメント
# 1行コメント
# 1行コメント

複数行は「=pod」「=cut」でできるけどなんとなく邪道なイメージ。

PHP
<?php
// 1行コメント
#  1行コメント
/*
 * 複数行コメント
 */
?>

3種類。

最近のスタイルでは#よりも//が好まれます。
P14

へえ。へえ。へえ。ほんとかな。

文字列

Perl
print 'Single\n';
print "Double\n";
print 'Single\n';
Single\nDouble
Single\n
PHP
<?php
print 'Single\n';
print "Double\n";
print 'Single\n';
?>
Single\nDouble
Single\n

これはPerlPHPも同じ。
""は展開されるし、''は展開されない。変数も。

ヒアドキュメント

Perl
$id = 'abcde111';
print << END_OF_SQL;
SELECT COUNT(*)
  FROM users
 WHERE id = '$id'
END_OF_SQL
PHP
<?php
$id = 'abcde111';
print <<< END_OF_SQL
SELECT COUNT(*)
  FROM users
 WHERE id = '$id'
END_OF_SQL;
?>

PHPの場合、小なり「<」が1個多くて3個。
Perlと同じく裸の区切り単語で中の変数は展開される。
ただし、終わりの区切り文字にセミコロンをつけることもできる。
が、つけなくてもよいのでPerlに慣れている僕はきっとつけない。

trueとfalse

多い。

ifelse

Perl
if (EXPR) {
}
elsif (EXPR) {
}
else {
}
PHP
<?php
if (EXPR) {
}
elseif (EXPR) {
}
else {
}
?>

PHPは「elseif」ですよ。

配列

Perl
@array = (
  'Safari',
  'FireFox',
  'Chrome',
  'IE',
  'Opera',
);
$count = @array;
print $count; #=> 5
PHP
<?php
$array = array(
  'Safari',
  'FireFox',
  'Chrome',
  'IE',
  'Opera',
);
$count = count($array);
print $count; #=> 5
?>

配列を「$」に入れるから見た目が慣れないな…。
配列の最後にカンマ入れても問題ないのは同じ。よかった。

ハッシュ

Perl
%hash = (
  red   => '#f00',
  green => '#0f0',
  blue  => '#00f',
);
print $hash{red}; #=> #f00
PHP
<?php
$hash = array(
  red   => '#f00',
  green => '#0f0',
  blue  => '#00f',
);
print $hash[red]; #=> #f00
?>

ハッシュもPerlの「%」の代わりにPHPでは「$」に入れる。
入れるときは「=>」。Perlではただの「,」の代わりだけど、PHPでは必須みたい。まじか。
取り出しは[]。
それくらい。

push()

Perl
push(@array, 'iCab');
PHP
<?php
$array[] = 'iCab';
?>

おおう。
これは全然違うなー。

foreach

配列のまわし方。
まあPerlはforもforeachも同じもので僕はC的なforは使わないので、そのバージョン。

Perl
foreach my $browser (@array) {
  print "$browser\n";
}
PHP
<?php
foreach ($array as $browser) {
  print "$browser\n";
}
?>

おおう。宣言逆かー。


ハッシュの場合。

Perl
foreach my $col (keys(%hash)) {
  print "$col, $hash{$col}\n";
}
PHP
<?php
foreach ($hash as $col => $rgb) {
  print "$col, $hash[$col]\n";
}
?>

ハッシュのキー存在有無

Perl
if (exists($hash{red})) {
}
PHP
<?php
if (array_key_exists('red', $hash)) {
}
?>

ハッシュの値で存在有無

Perl
if (grep('#f00' eq $_, values(%hash))) {
}
PHP
<?php
if (in_array('#f00', $hash)) {
}
?>

Perlだとややこしいけど、PHPだと専用のがあるらしい。


さらにそのキーを取得だと、

Perl
if (my ($col) = grep('#f00' eq $hash{$_}, keys(%hash))) {
}
PHP
<?php
if ($col = array_search('#f00', $hash)) {
}
?>

こんな感じ。

ハッシュをdelete()

Perl
delete($hash{red});
PHP
<?php
unset($hash[red]);
?>

配列をjoin()

Perl
print join(',', @array); #=> Safari,FireFox,Chrome,IE,Opera,iCab
PHP
<?php
print implode(',', $array); #=> Safari,FireFox,Chrome,IE,Opera,iCab
?>

配列をsplit()

Perl
$browser = 'Safari,FireFox,Chrome,IE,Opera,iCab';
@array = split(/,/, $browser);
print $array[2]; #=> Chrome
PHP
<?php
$browser = 'Safari,FireFox,Chrome,IE,Opera,iCab';
$array = explode(',', $browser);
print $array[2]; #=> Chrome
?>
Perl PHP
join() implode()
split() explode()

配列をsort()

Perl
@array = sort(@array);
print "@array\n"; #=> Chrome FireFox IE Opera Safari iCab
PHP
<?php
sort($array);
foreach ($array as $browser) {
  print "$browser ";
}
#=> Chrome FireFox IE Opera Safari iCab
?>

PHPは直接配列をソートされちゃいます><

配列を逆順にする

Perl
@array = reverse(@array);
PHP
<?php
$array = array_reverse($array);
?>

配列を逆順にソート

Perl
@array = reverse(sort(@array));
PHP
<?php
rsort($array);
?>

PHPは専用のがあるのか。

ハッシュをソート

ここからPHPを先に。

PHP
<?php
sort($hash);
foreach ($hash as $col => $rgb) {
  print "$col, $rgb\n";
}
#=> 0, #00f
#=> 1, #0f0
#=> 2, #f00
?>

うおい。
キーのところが配列の添字に変えられてしまったよ。
Perlなら、

Perl
@array = ();
push @array, $_ for sort(values(%hash));

こんな感じの意味。


キーの値を壊さずに値の方でソートするにはasort()。

PHP
<?php
asort($hash);
foreach ($hash as $col => $rgb) {
  print "$col, $rgb\n";
}
#=> blue, #00f
#=> green, #0f0
#=> red, #f00
?>

Perlなら、ハッシュに順番がないので、

Perl
@array = ();
for my $rgb (sort(values(%hash))) {
  my ($col) = grep($rgb eq $hash{$_}, keys(%hash));
  push @array, ($col, $rgb);
}
print "@array\n"; #=> blue #00f green #0f0 red #f00

複雑。


キーでソート。

PHP
<?php
ksort($hash);
?>

Perlなら、ハッシュに順番がないので、

Perl
@array = ();
for my $col (sort(keys(%hash))) {
  push @array, ($col, $hash{$col});
}
print "@array\n"; #=> blue #00f green #0f0 red #f00


PHPのsort()、asort(), ksort()はそれぞれ逆順があって、

昇順 降順
sort() rsort()
asort() arsort()
ksort() krsort()

とのこと。
なんか……、reverseでええやんと思ったり思わなかったり。



とりあえずその1で。