perlの間接オブジェクト記法によるnewでハマった

2015年7月19日

Perlのコードでデータをgunzipしたくて、IO::Uncompress::GunzipのReadMeを見ていて見慣れない記法に気付いた

IO::Uncompress:Gunzipモジュール

IO::Uncompress:Gunzipモジュールではgunzipをエクスポートできるので、そのまま関数を呼び出して使うと良いらしい。

use IO::Uncompress::Gunzip qw/gunzip $GunzipError/;

〜〜〜〜

gunzip \$enc_data => \$dec_data;

print $dec_data

とりあえず上記で要件は足りたのだが、
IO::Uncompress:Gunzipオブジェクトを生成してそいつでデコードできたりするのかなーと思って調べてみた。
(結局よく分からず。。。orz_)

CPANのReadMe中盤のConstructorの項

   my $z = new IO::Uncompress::Gunzip $input [OPTS]
        or die "IO::Uncompress::Gunzip failed: $GunzipError\n";

ん?
$z = new IO::Uncompress::Gunzip“?

え? perlで"new"演算子が使えるの??

もともと私はC++からプログラムを覚えて、perlで見せかけのオブジェクト指向を見て逆に面白いと感じていた。
な・の・に、Perlでnew演算子だと!!
ハゲル!!」とテンパり、悩むこと数時間

結論から言うと「間接オブジェクト記法」または「間接オブジェクト構文」というものらしい。Perlでは昔から存在するらしいが、最近では非推奨との記述もちらほら。
個人的には存在意義が分からないし、Perlとしてのソースコードの整合性を乱している気がするので使いたくはないなーと思った

参考サイト

http://perldoc.jp/docs/perl/5.8.8/perlobj.pod#Indirect32Object32Syntax

メモperl

Posted by gm2bv