私が歌川です

@utgwkk が書いている

Perl::Critic::Policy::Subroutines::ProhibitBuiltinHomonyms で許可する識別子を設定できるようになった

これは Perl Advent Calendar 2022 13日目の記事です。昨日の記事は Perlで戻り値として呼び出した子サブルーチンのコンテキストは親と同じ - hogashi.* でした。

perlcriticは、Perl向けのlinterです。詳しくは以下の記事などを参照してください。

blog.utgw.net

perlcriticの組み込みポリシー*1の1つに Subroutines::ProhibitBuiltinHomonyms があります。これは、Perlの組み込みサブルーチンや予約語と同じ名前のサブルーチンの定義を禁止するポリシーです。podから引用すると、以下のようなサブルーチン定義がポリシー違反だとみなされます。

sub open {}    #not ok
sub exit {}    #not ok
sub print {}   #not ok
sub foreach {} #not ok
sub if {}      #not ok

ところで、サブルーチンを使ってコントローラー定義するときは sub indexsub delete のような名前で定義するほうが意味が伝わりやすいこともあるかもしれません。これまでは、perlcriticの警告を抑制するためにいちいち ## no critic コメント*2を書く必要がありました。しかし、もうちょっと設定の余地があってほしいものです。

ということで、Subroutines::ProhibitBuiltinHomonyms ポリシーが許可する識別子を設定できるようにするPRを (2年前に) 作り、つい先日取り込まれました。perlcriticの次のリリースではきっと設定項目が増えていると思います。

github.com


2023/1/6 追記: 当該の設定項目が perlcritic 1.146でリリースされました。

Subroutines::ProhibitBuiltinHomonyms now can take an "allows" parameter to specify subroutines that won't violate the policy. Thanks, UTAGAWA Kiki. (GH #14, #932) https://metacpan.org/release/PETDANCE/Perl-Critic-1.146/source/Changes#L12-14


PPI*3でPerlの構文木を触ったことがある人なら、比較的簡単にperlcriticにコントリビュートできると思います。みなさまも既存のポリシーに不満があれば、設定項目を足したり新しいポリシーを作ったりしてみてはいかがでしょうか。

明日は id:sfujiwara さんです。

*1:ESLintのルールに相当します

*2:eslint-disable コメントに相当します

*3:Perlプログラムをパースするライブラリ