Masteries

技術的なことや仕事に関することを書いていきます.

間接オブジェクト記法とPerl 7 (追記あり)

コードレビューする時に軽く調べたので, 備忘録として軽くまとめておきます.

2020年11月29日追記: 当初はPerl 7で間接オブジェクト記法は非推奨になる予定でしたが, 状況が変わって非推奨にしない方針となったようです.

github.com

@argrath さん情報ありがとうございました!


間接オブジェクト記法とは, こういう記法です:

my $obj = new Object;

これは, 以下のコードと同じです:

my $obj = Object->new();

「初めてみた!」, 「使ったことない!」という方もいるかもしれませんが, 実は標準エラー出力をする際の,

print STDERR 'foobar';

も間接オブジェクト記法で, 以下のコードと同じだったりします:

STDERR->print('foobar');

さて, この間接オブジェクト記法ですが, 下記エントリによるとPerl 7においては非推奨になりそうです.

www.perl.com

Perl 5.32.0以降では, no feature qw(indirect);とすることで間接オブジェクト記法の利用を制限することができ, これはPerl7においてデフォルトで有効になるようです.

Perl 7のリリース後も, Perl 5は引き続きメンテナンスされ続けます. そのため, 直ちに間接オブジェクト記法を撤廃する必要はなさそうですが, とはいえ将来的にPerl 7への以降を見据えているのであれば, 早い段階から間接オブジェクト記法を使わないようにしておく必要がありそうです.

※ 以下 2020年11月29日追記

...が, 後にPerl 7において間接オブジェクト記法の非推奨化は見送る, という方針になったようです.

github.com

理由として,

Initial testing shows a high amount of breakage on CPAN.

と書かれており, 要するに実際に非推奨にして試してみたところ, たくさんのCPANモジュールが動作しなくなったため, 断念した... ようです.

何れにせよ, Perl 7において非推奨にしたい! という声が挙がった程度には微妙な記法であることには間違いと言えるのではないでしょうか. なので, (print STDERR ...のような例を除いて)今後間接オブジェクト記法を利用するケースはないと思ってよい/既に使っている場合はなるべく使わないように書き換えていった方が良い... という温度感で良いのではないか, と思っています.

あわせてよみたい (参考文献)

kfly8.hatenablog.com

余談

Perl 5.32.0で no feature qw(indirect); とすると,

my $obj = new Object;

というコードは次のようなエラーになります:

Bareword found where operator expected at indirect.pl line x, near "new Object"
        (Do you need to predeclare new?)

一方で, 以下のコードは no feature qw(indirect); とされていても問題なく動作します:

print STDERR 'foobar';

恐らくですが, こういった形での間接オブジェクト記法の利用はかなり頻繁に使われているので, 一律で利用禁止にする訳ではなく, 例外(?)を設けているのではないかと思います.