perl
講義が暇でネットにもつなげなくて何をしようかと思って、何気なくperlのマニュアルを読んでたら普通にチュートリアルがあった。
英語だけどかなり充実している感じ(つっても、今回やろうと思うのはperlintroだけ)。
なので、ちょっと勉強してみよう。気になったとこだけ書いてみる。
その前に
manはinfoツールで閲覧しているわけだけど、いまいち不便なのでファイルに保存しておく。
manを PostScript ファイルにするには、
% gzcat /usr/share/man/man1/perlintro.1.gz | groff -man > perlintro.ps
とすればよい。
if構文は必ず{}で閉じること。
C、javaとかをやっていると一命令なら、つい括弧を使わずに済ますこともあるけど、perlではそれはできない。
# 必ず{ ... }で括る if ( condition ) { proc; } # 以下は正しくない if ( condition ) proc;
厳格(strict)なmy - 変数宣言
変数宣言を行う際には修飾子myを使用する方法と、しない方法がある。
変数宣言の前にmyを使用する場合はスコープが厳密に適用されるのに対し、使用しない場合はグローバル変数扱いのよう使用される。
例えば、myなしではwhileの中で宣言されていても、while外でも使用できる。
また、変数宣言されていなかったり、スコープの範囲外の変数については無視される(ただし、後で述べるuse strictや、use warningsを宣言しているとエラー扱いとなる)。
my $a = "foo"; if ($some_condition) { my $b = "bar"; $c = "hoge"; print $a; print $b; print $c; } print $a; print $b; #prints nothing, because out of scope my $b print $c; #prints "hoge"
ちなみに、use strictを宣言してしまうと$cはスコープ範囲外ということでエラーとなる。
まぁ、Cとかを学んできた人たちにとっては当たり前な処理だと思う。たぶん。
ネットでちょろっと調べてみると、どうやらこのstrictは問題らしく、初心者はあまりスコープの問題を意識せずに(というか説明なされずに?)単に、$foo = ..., をmy $foo = ...の代わりに使うみたい。
そして、勉強していくうちにuse strictやuse warningsを使うようになって厄介さを感じるようだ。
サブルーチン
Cでは一般的に関数(function)という呼び名が一般的だと思うけど、perlではサブルーチン(subroutine)なのかな?
sub routine_name {...}
引数の取り出し方は一般的に2種類あって、以下の通り。
# shiftを使用する方法 sub mult { my $x = shift; my $y = shift; return $x*$y; } # @_を使用する方法 sub mult { my ($x, $y) = @_; return $x*$y; }
引数は@_に格納されていて、それを一つづつ取り出すには"shift"を使用し、一気に取り出そうとするなら@_を使用する。
ちなみに、3つの引数に対して($1,$2) = @_として、最後にshiftで引数を取ってこようとすると間違った事になるので注意。その逆はOK。
たとえば、体積を求めるサブルーチンcube
my $a = 3; my $b = 4; my $c = 5; print cube1($a,$b,$c),"\n"; # 60 print cube2($a,$b,$c),"\n"; # 36 = $a * $b * $a # currect sub cube1 { my $x = shift; # 変数リストがシフトされる my ($y, $z) = @_; # 第二引数、第三引数が入る return $x*$y*$z; } # wrong! sub cube2 { my ($x, $y) = @_; # 変数がシフトされない my $z = shift; # 第一引数が入る return $x*$y*$z; }
まぁ、普通に一方だけを使っていけば問題ない。
ちなみに、引数は値渡しではなく参照渡し。
参照渡しとは限らない。