対話的に実行されているかどうかを調べるIO::Interactive

プログラムが対話的に実行されているかどうかで処理を分けるにはIO::Interactiveを使うと非常に楽です。

use IO::Interactive qw(is_interactive);
if (is_interactive) {
    print {*STDOUT} q{Now, interactive};
    # negotiate with human
}
% perl -MIO::Interactive=is_interactive -e 'print {*STDOUT} q{Now, interactive} if is_interactive'
Now, interactive

% : | perl -MIO::Interactive=is_interactive -e 'print {*STDOUT} q{Now, interactive} if is_interactive'
%

STDOUTに出力することに限定すれば、もっと簡単に書けて、

use IO::Interactive qw(interactive);
print {interactive} q{Now, interactive};
% perl -MIO::Interactive=interactive -e 'print {interactive} q{Now, interactive}'
Now, interactive

% : | perl -MIO::Interactive=interactive -e 'print {interactive} {Now, interactive}'
%


また、STDOUTの代わりにSTDERRを対象とするには、is_interactive(*STDERR), interactive(*STDERR)と書きます。