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:自分でメールするのが筋な気もするけど