初めてPerl触って思ったこととか

Perl暦一週間。ホントにまったく何にも知らないのに一身上の都合で使うことになって、勉強してみたらいろいろ驚きというかなんというか・・・。なにかが根本的に間違ってるかもしれないけど、とりあえず触ってみて思ったこと。

関数定義

sub funcname {
  my($arg1, $arg2, $arg3) = @_;
  # do something
}

関数定義に仮引数がなくて毎回こう書かないとだめみたいなんだけど、誰も文句言わないのこれ?ほんとに?
単なるシンタックスシュガーでいいから

sub funcname($arg1, $arg2, $arg3) {
  # do something
}

こう書かせてほしいんだけど。
コーディングなんてその大部分は関数定義なんだから、そういうところにはもう少し気を使ってくれてもいいと思う・・・。

プレフィックス名前空間

変数の型に応じてプレフィックスつけるのは、まぁ20年近く前からがんばってる言語だし別にいいかなと思うけど、プレフィックスごとに名前空間が違う(よね?)のはなんなん?

つまり$var(スカラ)と@var(配列)が完全に別物。で、それだけならまだいいんだけど、配列の要素がスカラだとプレフィックスが$になって@varの第一要素は$var[0]。結果、$varと$var[0]がまったく無関係ってのは流石にちょっとおかしくない?

慣れれば気にならないのかもしれないけど、その慣れはむしろ感覚の歪みと呼びたい。括弧が見えなくなるってレベルじゃねーぞ

オブジェクト指向

360度どこから見ても後付けです。本当にあr

いや、PythonのOOも今までずっと後付けっぽいなぁと思ってたんだけど、すいませんでした。Perl見た今となってはとてもそんなこといえません。Pythonさんは十分綺麗なオブジェクト指向言語っす。

ちなみにPerlのクラス定義テンプレ。「やり方はいろいろある」し、そもそもPerlぜんぜんわかってない人が書くものなので細かいところは大目に見ていただきたく。

# クラス名定義
package PackageName::ClassName;

# 親クラス設定
use base qw(PackageName::ParentClassName);

# コンストラクタ定義
sub new {
  my($class, @args) = @_;
  my $obj = bless $class->SUPER::new(), $class;
  $obj->initialize(@args);
  return $obj;
}

# インスタンス初期化
sub initialize {
  my($self, @args) = @_;
  $self->{instance_variable1} = 'scolar instance variable';
  $self->{instance_variable2} = ['array', 'instance', 'variable'];
  $self->{instance_variable3} = {hash => 'instance variable'};
}

# メソッド定義
sub method1 {
  my($self, @args) = @_;
  $self->{instance_variable1};
}

同じのRubyで書いたらこうかなぁ・・・。

module PackageName
  class ClassName < ParentClassName
    def initialize
      super
      @instance_variable1 = 'scolar instance variable'
      @instance_variable2 = ['array', 'instance', 'variable']
      @instance_variable3 = {:hash => 'instance variable'}
    end

    def method1
      @instance_variable1
    end
  end
end

まぁはじめからOOが考慮されてるRubyと比べるのはちょっと卑怯なんだけどさ、それにしたって・・・。