#!/usr/bin/env perl
use utf8;
use Encode;
die "input align regexp as argment.\n" if @ARGV == 0;
my ( $search, $left_align ) = @ARGV;
my ( @matrixs_ref, @column_widths );
sub true_length {
my ( $raw_line, $j, $e ) = ( shift, 0, 0 );
for ( split( //, Encode::decode( 'UTF8', $raw_line ) ) ) {
/\P{ascii}/ ? ++$j:
/\N/ ? ++$e:
next;
}
2 * $j + $e;
}
while ( chomp( my $raw_line = <STDIN> ) ) {
my @columns = split( /$search/, $raw_line );
push @matrixs_ref, \@columns;
# extend list to modify map working by longer list
push( @column_widths, 0 ) while ( $#columns - $#column_widths > 0 );
@column_widths = map {
$column_widths[$_] > true_length( $columns[$_] )
? $column_widths[$_]
: true_length( $columns[$_] );
} ( 0 .. $#column_widths );
}
for my $divided_ref (@matrixs_ref) {
my $i = 0;
for (@$divided_ref) {
if ($left_align) {
print;
print q{ } x ( $column_widths[ $i ] - true_length($_) )
unless ( $i == -1 + @$divided_ref );
}
else {
print q{ } x ( $column_widths[ $i ] - true_length($_) );
print;
}
}
continue {
print q{ } unless ( ++$i == @$divided_ref );
}
print "\n";
}
IyEvdXNyL2Jpbi9lbnYgcGVybAp1c2UgdXRmODsKdXNlIEVuY29kZTsKCmRpZSAiaW5wdXQgYWxpZ24gcmVnZXhwIGFzIGFyZ21lbnQuXG4iIGlmIEBBUkdWID09IDA7Cm15ICggJHNlYXJjaCwgJGxlZnRfYWxpZ24gKSA9IEBBUkdWOwpteSAoIEBtYXRyaXhzX3JlZiwgQGNvbHVtbl93aWR0aHMgKTsKCnN1YiB0cnVlX2xlbmd0aCB7CiAgICBteSAoICRyYXdfbGluZSwgJGosICRlICkgPSAoIHNoaWZ0LCAwLCAwICk7CiAgICBmb3IgKCBzcGxpdCggLy8sIEVuY29kZTo6ZGVjb2RlKCAnVVRGOCcsICRyYXdfbGluZSApICkgKSB7CiAgICAgICAgL1xQe2FzY2lpfS8gPyArKyRqOgogICAgICAgIC9cTi8gICAgICAgID8gKyskZToKICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICB9CiAgICAyICogJGogKyAkZTsKfQoKd2hpbGUgKCBjaG9tcCggbXkgJHJhd19saW5lID0gPFNURElOPiApICkgewogICAgbXkgQGNvbHVtbnMgPSBzcGxpdCggLyRzZWFyY2gvLCAkcmF3X2xpbmUgKTsKICAgIHB1c2ggQG1hdHJpeHNfcmVmLCBcQGNvbHVtbnM7CiAgICAjIGV4dGVuZCBsaXN0IHRvIG1vZGlmeSBtYXAgd29ya2luZyBieSBsb25nZXIgbGlzdAogICAgcHVzaCggQGNvbHVtbl93aWR0aHMsIDAgKSB3aGlsZSAoICQjY29sdW1ucyAtICQjY29sdW1uX3dpZHRocyA+IDAgKTsKICAgIEBjb2x1bW5fd2lkdGhzID0gbWFwIHsKICAgICAgICAgICAgJGNvbHVtbl93aWR0aHNbJF9dID4gdHJ1ZV9sZW5ndGgoICRjb2x1bW5zWyRfXSApCiAgICAgICAgICA/ICRjb2x1bW5fd2lkdGhzWyRfXQogICAgICAgICAgOiB0cnVlX2xlbmd0aCggJGNvbHVtbnNbJF9dICk7CiAgICB9ICggMCAuLiAkI2NvbHVtbl93aWR0aHMgKTsKfQoKZm9yIG15ICRkaXZpZGVkX3JlZiAoQG1hdHJpeHNfcmVmKSB7CiAgICBteSAkaSA9IDA7CiAgICBmb3IgKEAkZGl2aWRlZF9yZWYpIHsKICAgICAgICBpZiAoJGxlZnRfYWxpZ24pIHsKICAgICAgICAgICAgcHJpbnQ7CiAgICAgICAgICAgIHByaW50IHF7IH0geCAoICRjb2x1bW5fd2lkdGhzWyAkaSBdIC0gdHJ1ZV9sZW5ndGgoJF8pICkKICAgICAgICAgICAgICB1bmxlc3MgKCAkaSA9PSAtMSArIEAkZGl2aWRlZF9yZWYgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByaW50IHF7IH0geCAoICRjb2x1bW5fd2lkdGhzWyAkaSBdIC0gdHJ1ZV9sZW5ndGgoJF8pICk7CiAgICAgICAgICAgIHByaW50OwogICAgICAgIH0KICAgIH0KICAgIGNvbnRpbnVlIHsKICAgICAgICBwcmludCBxeyB9IHVubGVzcyAoICsrJGkgPT0gQCRkaXZpZGVkX3JlZiApOwogICAgfQogICAgcHJpbnQgIlxuIjsKfQo=