App::Ack と IO::Interactive
いや、これ ack のバグじゃないかな。Mac とか関係ないっぽい。
ack-1.58 まで出力が端末かどうかの判定は
my $is_tty = -t STDOUT;
だったのが、ack-1.60 で突然 IO::Interactive のコードを引っ張ってきたようで、その該当コードが以下。
@ARGV を参照して入力が端末かどうか調べている訳で、この判定コード自体が ack に適してないんじゃないかな。ack の場合、@ARGV には検索パターンが入っている訳だし。
というわけで、作者にメールするのがベストなのではないかと*1。
=head2 C<is_interactive()> This is taken directly from Damian Conway's IO::Interactive. Thanks, Damian! This subroutine returns true if C<*ARGV> and C<*STDOUT> are connected to the terminal. The test is considerably more sophisticated than: -t *ARGV && -t *STDOUT as it takes into account the magic behaviour of C<*ARGV>. You can also pass C<is_interactive> a writable filehandle, in which case it requires that filehandle be connected to a terminal (instead of C<*STDOUT>). The usual suspect here is C<*STDERR>: if ( is_interactive(*STDERR) ) { carp $warning; } =cut sub is_interactive { my ($out_handle) = (@_, select); # Default to default output handle # Not interactive if output is not to terminal... return 0 if not -t $out_handle; # If *ARGV is opened, we're interactive if... if ( Scalar::Util::openhandle( *ARGV ) ) { # ...it's currently opened to the magic '-' file return -t *STDIN if defined $ARGV && $ARGV eq '-'; # ...it's at end-of-file and the next file is the magic '-' file return @ARGV>0 && $ARGV[0] eq '-' && -t *STDIN if eof *ARGV; # ...it's directly attached to the terminal return -t *ARGV; } # If *ARGV isn't opened, it will be interactive if *STDIN is attached # to a terminal and either there are no files specified on the command line # or if there are files and the first is the magic '-' file else { return -t *STDIN && (@ARGV==0 || $ARGV[0] eq '-'); } }
*1:自分でメールするのが筋な気もするけど