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;
}

まぁ、普通に一方だけを使っていけば問題ない。
ちなみに、引数は値渡しではなく参照渡し

参照渡しとは限らない。


CPAN module

install

read perlmodinstall

use

Module::Name

how to use

perldoc Module::Name



独習JavaとCore Servlet & JSPを読み終わったらGaucheと一緒にperlをやるのも楽しそう。


。。。何を使うかじゃなくて何を作るかなんだけどなぁ。本当は。
まぁ、今までスクリプト言語をほとんど勉強したことがないし別にいいんだど。