The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;

use Encode;
use Template;

sub usage {
    print <<EOF;
usage: $0 [limit length]
    (ex) % echo "good morning" | $0 10
EOF
}

unless (@ARGV) {
    usage();
    exit;
}

my $limit = shift @ARGV;
unless ($limit =~ m/^\d+$/) {
    die "limit length is not digit.";
}

my $tt = Template->new({
    PLUGINS => {
        VisualTruncate => 'Template::Plugin::Filter::VisualTruncate'
    }
});
my $content = do {
    local $/; # enable "slurp" mode
    <STDIN>;  # whole file now here
};
my $template = qq/[% USE VisualTruncate %][% FILTER visual_truncate($limit) %][% content %][% END %]/;

my $out;
$tt->process(\$template, { content => $content }, \$out);

print $out,"\n";