CLI コマンドが、モジュールを兼ねるメリット

CLI コマンドをモジュールにするメリットは、そのコマンド内部の関数を 別の文脈・プログラムから実行できる(可能性が生まれる)ことです。

例えば他人の書いたスクリプト foo.pl があって、 その中の関数 bar だけを試しに実行してみたい、 と思ったことは無いですか?

# foo.pl の中身

while (<>) { ...; bar($., $_); ... }

sub bar {
  my ($x, $y) = @_;
  ...
}
...

foo.pl を他のプログラムからそのままロードした場合、 その中のトップレベルのコード(while (<>) など)も実行されてしまいます。 なので、どうしても bar だけを実行したいなら、bar に関係する部分だけを 手で抜き出す必要があるでしょう。これは大抵、困難な作業です。

それに対して、このプログラムが最初からモジュール Foo.pm として 書かれていたらどうでしょう?

# Foo.pm の中身

sub run {
  while (<>) { ...; bar($., $_); ... }
}

sub bar {
  my ($x, $y) = @_;
  ...
}

run() unless caller;
1

この場合、モジュール Foo をロードして、 正しい引数を渡すだけで bar を 実行できる可能性が出てきます(もちろん、実際にはグローバル変数に依存する可能性もありますが)

副次的に、bar だけを perlデバッガから呼び出したり、profile することも容易になります。