package Acme::CPANModules::TextTable;

use 5.010001;
use strict;
use warnings;
use utf8;

our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2023-06-15'; # DATE
our $DIST = 'Acme-CPANModules-TextTable'; # DIST
our $VERSION = '0.015'; # VERSION

sub _make_table {
    my ($cols, $rows, $celltext) = @_;
    my $res = [];
    push @$res, [];
    for (0..$cols-1) { $res->[0][$_] = "col" . ($_+1) }
    for my $row (1..$rows) {
        push @$res, [ map { $celltext // "row$row.$_" } 1..$cols ];
    }
    $res;
}

our $LIST = {
    summary => 'Modules that generate text tables',
    description => <<'_',

Currently excluded from this list are:

- <pm:Text::SimpleTable::AutoWidth> (wrapper to <pm:Text::SimpleTable>);
- <pm:Text::ASCIITable::EasyTable> (wrapper to <pm:Text::ASCIITable>);

_
    entry_features => {
        wide_char => {summary => 'Whether the use of wide characters (e.g. Kanji) in cells does not cause the table to be misaligned'},
        color_data =>  {summary => 'Whether module supports ANSI colors (i.e. text with ANSI color codes can still be aligned properly)'},
        multiline_data => {summary => 'Whether module supports aligning data cells that contain newlines'},

        box_char => {summary => 'Whether module can utilize box-drawing characters'},
        custom_border => {summary => 'Whether module allows customizing border in some way'},

        align_row => {summary => "Whether module supports aligning text horizontally in a row (left/right/middle)"},
        align_column => {summary => "Whether module supports aligning text horizontally in a column (left/right/middle)"},
        align_cell => {summary => "Whether module supports aligning text horizontally in individual cells (left/right/middle)"},

        valign_row => {summary => "Whether module supports aligning text vertically in a row (top/bottom/middle)"},
        valign_column => {summary => "Whether module supports aligning text vertically in a column (top/bottom/middle)"},
        valign_cell => {summary => "Whether module supports aligning text vertically in individual cells (top/bottom/middle)"},

        rowspan => {summary => "Whether module supports row spans"},
        colspan => {summary => "Whether module supports column spans"},

        custom_color => {summary => 'Whether the module produces colored table and supports customizing color in some way'},
        color_theme => {summary => 'Whether the module supports color theme/scheme'},

        speed => {summary => "Rendering speed", schema=>'str*'},

        column_width => {summary => 'Whether module allows setting the width of columns'},
        per_column_width => {summary => 'Whether module allows setting column width on a per-column basis'},
        row_height => {summary => 'Whether module allows setting the height of rows'},
        per_row_height => {summary => 'Whether module allows setting row height on a per-row basis'},

        pad => {summary => 'Whether module allows customizing cell horizontal padding'},
        vpad => {summary => 'Whether module allows customizing cell vertical padding'},
    },
    entries => [
        {
            module => 'Text::Table::Any',
            description => <<'_',

This is a frontend for many text table modules as backends. The interface is
dead simple, following <pm:Text::Table::Tiny>. The main drawback is that it
currently does not allow passing (some, any) options to each backend.

_
            bench_code => sub {
                my ($table) = @_;
                Text::Table::Any::table(rows=>$table, header_row=>1);
            },
            features => {
                align_cell     => {value=>undef, summary=>"Depends on backend"},
                align_column   => {value=>undef, summary=>"Depends on backend"},
                align_row      => {value=>undef, summary=>"Depends on backend"},
                box_char       => {value=>undef, summary=>"Depends on backend"},
                color_data     => {value=>undef, summary=>"Depends on backend"},
                color_theme    => {value=>undef, summary=>"Depends on backend"},
                colspan        => {value=>undef, summary=>"Depends on backend"},
                custom_border  => {value=>undef, summary=>"Depends on backend"},
                custom_color   => {value=>undef, summary=>"Depends on backend"},
                multiline_data => {value=>undef, summary=>"Depends on backend"},
                rowspan        => {value=>undef, summary=>"Depends on backend"},
                speed          => {value=>undef, summary=>"Depends on backend"},
                valign_cell    => {value=>undef, summary=>"Depends on backend"},
                valign_column  => {value=>undef, summary=>"Depends on backend"},
                valign_row     => {value=>undef, summary=>"Depends on backend"},
                wide_char_data => {value=>undef, summary=>"Depends on backend"},
            },
        },

        {
            module => 'Text::SimpleTable',
            description => <<'_',

As its name implies, a simple table-generating module with minimal documentation
and a few choices or border characters. You have to set the width of all columns
manually.

_
            bench_code => sub {
                my ($table) = @_;
                my @colspec = map {[9, $_]} @{ $table->[0] };
                my $ts = Text::SimpleTable->new(@colspec);
                for (1 .. $#{$table}) { $ts->row(@{ $table->[$_] }) }
                $ts->draw;
            },
            features => {
                align_cell     => {value=>0},
                align_column   => {value=>0},
                align_row      => {value=>0},
                box_char       => {value=>0},
                color_data     => {value=>0},
                color_theme    => {value=>0},
                colspan        => {value=>0},
                custom_border  => {value=>1, summary=>"Limited choice of 1 ASCII style and 1 UTF style"},
                custom_color   => {value=>0},
                multiline_data => {value=>0},
                rowspan        => {value=>0},
                speed          => {value=>'fast', summary=>'Slightly slower than Text::Table::Tiny'},
                valign_cell    => {value=>0},
                valign_column  => {value=>0},
                valign_row     => {value=>0},
                wide_char_data => {value=>0},
            },
        },

        {
            module => 'Text::UnicodeBox::Table',
            description => <<'_',

The main feature of this module is the various border style it provides drawn
using Unicode box-drawing characters. It allows per-row style. The rendering
speed is particularly slow compared to other modules.

_
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::UnicodeBox::Table->new;
                $t->add_header(@{ $table->[0] });
                $t->add_row(@{ $table->[$_] }) for 1..$#{$table};
                $t->render;
            },
            features => {
                align_cell => 0,
                align_column => 1,
                box_char => 0,
                color_data => 1,
                color_theme => 0,
                colspan => 0,
                custom_border => 1,
                custom_color => 0,
                multiline_data => 0,
                rowspan => 0,
                wide_char_data => 1,
                speed => "slow",
            },
        },

        {
            module => 'Text::Table::Manifold',
            description => <<'_',

Two main features of this module is per-column aligning and wide character
support. This module, aside from doing its rendering, can also be told to pass
rendering to HTML, CSV, or other text table module like
<pm:Text::UnicodeBox::Table>); so in this way it is similar to
<pm:Text::Table::Any>.

_
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::Table::Manifold->new;
                $t->headers($table->[0]);
                $t->data([ @{$table}[1 .. $#{$table}] ]);
                join("\n", @{$t->render(padding => 1)}) . "\n";
            },
            features => {
                align_cell => 0,
                align_column => 1,
                box_char => undef, # ?
                color_data => 1,
                color_theme => 0,
                colspan => 0,
                custom_border => {value=>0, summary=>"But this module can pass rendering to other module like Text::UnicodeBox::Table"},
                custom_color => 0,
                multiline_data => 0,
                rowspan => 0,
                wide_char_data => 1,
            },
        },

        {
            module => 'Text::ANSITable',
            description => <<'_',

This 2013 project was my take in creating a text table module that can handle
color, multiline text, wide characters. I also threw in various formatting
options, e.g. per-column/row/cell align/valign/pad/vpad, conditional formatting,
and so on. I even added a couple of features I never used: hiding rows and
specifying columns to display which can be in different order from the original
specified columns or can contain the same original columns multiple times. I
think this module offers the most formatting options on CPAN.

In early 2021, I needed colspan/rowspan and I implemented this in a new module:
<pm:Text::Table::Span> (later renamed to <pm:Text::Table::More>). I plan to add
this feature too to Text::ANSITable, but in the meantime I'm also adding more
formatting options which I need to Text::Table::More.

_
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::ANSITable->new(
                    use_utf8 => 0,
                    use_box_chars => 0,
                    use_color =>  0,
                    columns => $table->[0],
                    border_style => 'ASCII::SingleLine',
                );
                $t->add_row($table->[$_]) for 1..@$table-1;
                $t->draw;
            },
            features => {
                align_cell => 1,
                align_column => 1,
                align_row => 1,
                box_char => 1,
                color_data =>  1,
                color_theme => 1,
                colspan => 0,
                column_width => 1,
                custom_border => 1,
                custom_color => 1,
                multiline_data => 1,
                pad => 1,
                per_column_width => 1,
                per_row_height => 1,
                row_height => 1,
                rowspan => 0,
                speed => "slow",
                valign_cell => 1,
                valign_column => 1,
                valign_row => 1,
                vpad => 1,
                wide_char_data => 1,
            },
        },

        {
            module => 'Text::ASCIITable',
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::ASCIITable->new();
                $t->setCols(@{ $table->[0] });
                $t->addRow(@{ $table->[$_] }) for 1..@$table-1;
                "$t";
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => 0,
                multiline_data => 1,
            },
        },
        {
            module => 'Text::FormatTable',
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::FormatTable->new(join('|', ('l') x @{ $table->[0] }));
                $t->head(@{ $table->[0] });
                $t->row(@{ $table->[$_] }) for 1..@$table-1;
                $t->render;
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => 0,
                multiline_data => 1,
            },
        },
        {
            module => 'Text::MarkdownTable',
            bench_code => sub {
                my ($table) = @_;
                my $out = "";
                my $t = Text::MarkdownTable->new(file => \$out);
                my $fields = $table->[0];
                foreach (1..@$table-1) {
                    my $row = $table->[$_];
                    $t->add( {
                        map { $fields->[$_] => $row->[$_] } 0..@$fields-1
                    });
                }
                $t->done;
                $out;
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => 0,
                multiline_data => {value=>0, summary=>'Newlines stripped'},
            },
        },
        {
            module => 'Text::Table',
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::Table->new(@{ $table->[0] });
                $t->load(@{ $table }[1..@$table-1]);
                $t;
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => {value=>undef, summary=>'Does not draw borders'},
                multiline_data => 1,
            },
        },
        {
            module => 'Text::Table::Tiny',
            description => <<'_',

The simple and tiny table-generating module which I liked back in 2012 (v0.03).
It employs an sprintf() trick to generate a single row. This module started my
personal experiments creating other table-generating modules (at last count I've
created no fewer than 15 of them!).

_
            bench_code => sub {
                my ($table) = @_;
                Text::Table::Tiny::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  1,
                box_char => 1,
                multiline_data => 0,
            },
        },
        {
            module => 'Text::Table::TinyBorderStyle',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::TinyBorderStyle::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => 1,
                multiline_data => 0,
            },
        },
        {
            module => 'Text::Table::More',
            description => <<'_',

A module I wrote in early 2021. Main distinguishing feature is support for
rowspan/clospan. I plan to add more features to this module on an as-needed
basic. This module is now preferred to <pm:Text::ANSITable>, although currently
it does not offer nearly as many formatting options as Text::ANSITable.

_
            bench_code => sub {
                my ($table) = @_;
                Text::Table::More::generate_table(rows=>$table, header_row=>1);
            },
            features => {
                align_cell => 1,
                align_column => 1,
                align_row => 1,
                box_char => 1,
                color_data =>  1,
                color_theme => 0,
                colspan => 1,
                custom_border => 1,
                custom_color => 0,
                multiline_data => 1,
                rowspan => 1,
                speed => "slow",
                valign_cell => 1,
                valign_column => 1,
                valign_row => 1,
                wide_char_data => 1,
                column_width => 0, # todo
                per_column_width => 0, # todo
                row_height => 0, # todo
                per_row_height => 0, # todo
                pad => 0, # todo
                vpad => 0, # todo
            },
        },
        {
            module => 'Text::Table::Sprintf',
            description => <<'_',

A performant (see benchmark result) and lightweight (a page of code, no use of
modules at all), but with minimal extra features.

_
            bench_code => sub {
                my ($table) = @_;
                Text::Table::Sprintf::table(rows=>$table, header_row=>1);
            },
            features => {
                box_char => 0,
                color_data =>  0,
                multiline_data => 0,
                speed => {value=>"fast", summary=>"The fastest among the others in this list"},
                wide_char_data => 0,
            },
        },
        {
            module => 'Text::Table::TinyColor',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::TinyColor::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 0,
                color_data =>  1,
                box_char => 0,
                multiline_data => 0,
            },
        },
        {
            module => 'Text::Table::TinyColorWide',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::TinyColorWide::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  1,
                box_char => 0,
                multiline_data => 0,
            },
        },
        {
            module => 'Text::Table::TinyWide',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::TinyWide::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  0,
                box_char => 0,
            },
        },
        {
            module => 'Text::Table::Org',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::Org::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 0,
                color_data =>  0,
                box_char => 0,
                multiline_data => 0,
            },
        },
        {
            module => 'Text::Table::CSV',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::CSV::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  0,
                box_char => {value=>undef, summary=>"Irrelevant"},
                multiline_data => {value=>1, summary=>"But make sure your CSV parser can handle multiline cell"},
            },
        },
        {
            module => 'Text::Table::HTML',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::HTML::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  {value=>0, summary=>'Not converted to HTML color elements'},
                box_char => 0,
                multiline_data => 1,
            },
        },
        {
            module => 'Text::Table::HTML::DataTables',
            bench_code => sub {
                my ($table) = @_;
                Text::Table::HTML::DataTables::table(rows=>$table, header_row=>1);
            },
            features => {
                wide_char_data => 1,
                color_data =>  {value=>0, summary=>'Not converted to HTML color elements'},
                box_char => 0,
                multiline_data => 1,
            },
        },
        {
            module => 'Text::TabularDisplay',
            bench_code => sub {
                my ($table) = @_;
                my $t = Text::TabularDisplay->new(@{ $table->[0] });
                $t->add(@{ $table->[$_] }) for 1..@$table-1;
                $t->render; # doesn't add newline
            },
            features => {
                wide_char_data => 1,
                color_data =>  0,
                box_char => {value=>undef, summary=>"Irrelevant"},
                multiline_data => 1,
            },
        },
    ],

    bench_datasets => [
        {name=>'tiny (1x1)'          , argv => [_make_table( 1, 1)],},
        {name=>'small (3x5)'         , argv => [_make_table( 3, 5)],},
        {name=>'wide (30x5)'         , argv => [_make_table(30, 5)],},
        {name=>'long (3x300)'        , argv => [_make_table( 3, 300)],},
        {name=>'large (30x300)'      , argv => [_make_table(30, 300)],},
        {name=>'multiline data (2x1)', argv => [ [["col1", "col2"], ["foobar\nbaz\nqux\nquux","corge"]] ], include_by_default=>0 },
        {name=>'wide char data (1x2)', argv => [ [["col1"], ["no wide character"], ["宽字"]] ], include_by_default=>0 },
        {name=>'color data (1x2)'    , argv => [ [["col1"], ["no color"], ["\e[31m\e[1mwith\e[0m \e[32m\e[1mcolor\e[0m"]] ], include_by_default=>0 },
    ],

};

1;
# ABSTRACT: Modules that generate text tables

__END__

=pod

=encoding UTF-8

=head1 NAME

Acme::CPANModules::TextTable - Modules that generate text tables

=head1 VERSION

This document describes version 0.015 of Acme::CPANModules::TextTable (from Perl distribution Acme-CPANModules-TextTable), released on 2023-06-15.

=head1 SYNOPSIS

To run benchmark with default option:

 % bencher --cpanmodules-module TextTable

To run module startup overhead benchmark:

 % bencher --module-startup --cpanmodules-module TextTable

For more options (dump scenario, list/include/exclude/add participants, list/include/exclude/add datasets, etc), see L<bencher> or run C<bencher --help>.

=head1 DESCRIPTION

Currently excluded from this list are:

=over

=item * L<Text::SimpleTable::AutoWidth> (wrapper to L<Text::SimpleTable>);

=item * L<Text::ASCIITable::EasyTable> (wrapper to L<Text::ASCIITable>);

=back

=head1 ACME::CPANMODULES ENTRIES

=over

=item L<Text::Table::Any>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

This is a frontend for many text table modules as backends. The interface is
dead simple, following L<Text::Table::Tiny>. The main drawback is that it
currently does not allow passing (some, any) options to each backend.


=item L<Text::SimpleTable>

Author: L<MRAMBERG|https://metacpan.org/author/MRAMBERG>

As its name implies, a simple table-generating module with minimal documentation
and a few choices or border characters. You have to set the width of all columns
manually.


=item L<Text::UnicodeBox::Table>

Author: L<EWATERS|https://metacpan.org/author/EWATERS>

The main feature of this module is the various border style it provides drawn
using Unicode box-drawing characters. It allows per-row style. The rendering
speed is particularly slow compared to other modules.


=item L<Text::Table::Manifold>

Author: L<RSAVAGE|https://metacpan.org/author/RSAVAGE>

Two main features of this module is per-column aligning and wide character
support. This module, aside from doing its rendering, can also be told to pass
rendering to HTML, CSV, or other text table module like
L<Text::UnicodeBox::Table>); so in this way it is similar to
L<Text::Table::Any>.


=item L<Text::ANSITable>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

This 2013 project was my take in creating a text table module that can handle
color, multiline text, wide characters. I also threw in various formatting
options, e.g. per-column/row/cell align/valign/pad/vpad, conditional formatting,
and so on. I even added a couple of features I never used: hiding rows and
specifying columns to display which can be in different order from the original
specified columns or can contain the same original columns multiple times. I
think this module offers the most formatting options on CPAN.

In early 2021, I needed colspan/rowspan and I implemented this in a new module:
L<Text::Table::Span> (later renamed to L<Text::Table::More>). I plan to add
this feature too to Text::ANSITable, but in the meantime I'm also adding more
formatting options which I need to Text::Table::More.


=item L<Text::ASCIITable>

Author: L<LUNATIC|https://metacpan.org/author/LUNATIC>

=item L<Text::FormatTable>

Author: L<TREY|https://metacpan.org/author/TREY>

=item L<Text::MarkdownTable>

Author: L<VOJ|https://metacpan.org/author/VOJ>

=item L<Text::Table>

Author: L<SHLOMIF|https://metacpan.org/author/SHLOMIF>

=item L<Text::Table::Tiny>

Author: L<NEILB|https://metacpan.org/author/NEILB>

The simple and tiny table-generating module which I liked back in 2012 (v0.03).
It employs an sprintf() trick to generate a single row. This module started my
personal experiments creating other table-generating modules (at last count I've
created no fewer than 15 of them!).


=item L<Text::Table::TinyBorderStyle>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::More>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

A module I wrote in early 2021. Main distinguishing feature is support for
rowspan/clospan. I plan to add more features to this module on an as-needed
basic. This module is now preferred to L<Text::ANSITable>, although currently
it does not offer nearly as many formatting options as Text::ANSITable.


=item L<Text::Table::Sprintf>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

A performant (see benchmark result) and lightweight (a page of code, no use of
modules at all), but with minimal extra features.


=item L<Text::Table::TinyColor>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::TinyColorWide>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::TinyWide>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::Org>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::CSV>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::HTML>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::Table::HTML::DataTables>

Author: L<PERLANCAR|https://metacpan.org/author/PERLANCAR>

=item L<Text::TabularDisplay>

Author: L<DARREN|https://metacpan.org/author/DARREN>

=back

=head1 ACME::CPANMODULES FEATURE COMPARISON MATRIX

 +-------------------------------+----------------+------------------+---------------+--------------+----------------+-----------------+-------------+-------------------+------------------+---------------------+--------------+------------+------------------+--------------------+-----------------+----------------+-------------------+----------+-----------------------+---------------------+-----------------+-----------+
 | module                        | align_cell *1) | align_column *2) | align_row *3) | box_char *4) | color_data *5) | color_theme *6) | colspan *7) | custom_border *8) | custom_color *9) | multiline_data *10) | rowspan *11) | speed *12) | valign_cell *13) | valign_column *14) | valign_row *15) | wide_char_data | column_width *16) | pad *17) | per_column_width *18) | per_row_height *19) | row_height *20) | vpad *21) |
 +-------------------------------+----------------+------------------+---------------+--------------+----------------+-----------------+-------------+-------------------+------------------+---------------------+--------------+------------+------------------+--------------------+-----------------+----------------+-------------------+----------+-----------------------+---------------------+-----------------+-----------+
 | Text::Table::Any              | N/A *22)       | N/A *23)         | N/A *24)      | N/A *25)     | N/A *26)       | N/A *27)        | N/A *28)    | N/A *29)          | N/A *30)         | N/A *31)            | N/A *32)     | N/A *33)   | N/A *34)         | N/A *35)           | N/A *36)        | N/A *37)       | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::SimpleTable             | no             | no               | no            | no           | no             | no              | no          | yes *38)          | no               | no                  | no           | yes *39)   | no               | no                 | no              | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::UnicodeBox::Table       | no             | yes              | N/A           | no           | yes            | no              | no          | yes               | no               | no                  | no           | yes        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::Manifold         | no             | yes              | N/A           | N/A          | yes            | no              | no          | no *40)           | no               | no                  | no           | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::ANSITable               | yes            | yes              | yes           | yes          | yes            | yes             | no          | yes               | yes              | yes                 | no           | yes        | yes              | yes                | yes             | yes            | yes               | yes      | yes                   | yes                 | yes             | yes       |
 | Text::ASCIITable              | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::FormatTable             | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::MarkdownTable           | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | no *41)             | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table                   | N/A            | N/A              | N/A           | N/A *42)     | no             | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::Tiny             | N/A            | N/A              | N/A           | yes          | yes            | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::TinyBorderStyle  | N/A            | N/A              | N/A           | yes          | no             | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::More             | yes            | yes              | yes           | yes          | yes            | no              | yes         | yes               | no               | yes                 | yes          | yes        | yes              | yes                | yes             | yes            | no                | no       | no                    | no                  | no              | no        |
 | Text::Table::Sprintf          | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | yes *43)   | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::TinyColor        | N/A            | N/A              | N/A           | no           | yes            | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::TinyColorWide    | N/A            | N/A              | N/A           | no           | yes            | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::TinyWide         | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | N/A                 | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::Org              | N/A            | N/A              | N/A           | no           | no             | N/A             | N/A         | N/A               | N/A              | no                  | N/A          | N/A        | N/A              | N/A                | N/A             | no             | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::CSV              | N/A            | N/A              | N/A           | N/A *44)     | no             | N/A             | N/A         | N/A               | N/A              | yes *45)            | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::HTML             | N/A            | N/A              | N/A           | no           | no *46)        | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::Table::HTML::DataTables | N/A            | N/A              | N/A           | no           | no *47)        | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 | Text::TabularDisplay          | N/A            | N/A              | N/A           | N/A *48)     | no             | N/A             | N/A         | N/A               | N/A              | yes                 | N/A          | N/A        | N/A              | N/A                | N/A             | yes            | N/A               | N/A      | N/A                   | N/A                 | N/A             | N/A       |
 +-------------------------------+----------------+------------------+---------------+--------------+----------------+-----------------+-------------+-------------------+------------------+---------------------+--------------+------------+------------------+--------------------+-----------------+----------------+-------------------+----------+-----------------------+---------------------+-----------------+-----------+


Notes:

=over

=item 1. align_cell: Whether module supports aligning text horizontally in individual cells (left/right/middle)

=item 2. align_column: Whether module supports aligning text horizontally in a column (left/right/middle)

=item 3. align_row: Whether module supports aligning text horizontally in a row (left/right/middle)

=item 4. box_char: Whether module can utilize box-drawing characters

=item 5. color_data: Whether module supports ANSI colors (i.e. text with ANSI color codes can still be aligned properly)

=item 6. color_theme: Whether the module supports color theme/scheme

=item 7. colspan: Whether module supports column spans

=item 8. custom_border: Whether module allows customizing border in some way

=item 9. custom_color: Whether the module produces colored table and supports customizing color in some way

=item 10. multiline_data: Whether module supports aligning data cells that contain newlines

=item 11. rowspan: Whether module supports row spans

=item 12. speed: Rendering speed

=item 13. valign_cell: Whether module supports aligning text vertically in individual cells (top/bottom/middle)

=item 14. valign_column: Whether module supports aligning text vertically in a column (top/bottom/middle)

=item 15. valign_row: Whether module supports aligning text vertically in a row (top/bottom/middle)

=item 16. column_width: Whether module allows setting the width of columns

=item 17. pad: Whether module allows customizing cell horizontal padding

=item 18. per_column_width: Whether module allows setting column width on a per-column basis

=item 19. per_row_height: Whether module allows setting row height on a per-row basis

=item 20. row_height: Whether module allows setting the height of rows

=item 21. vpad: Whether module allows customizing cell vertical padding

=item 22. Depends on backend

=item 23. Depends on backend

=item 24. Depends on backend

=item 25. Depends on backend

=item 26. Depends on backend

=item 27. Depends on backend

=item 28. Depends on backend

=item 29. Depends on backend

=item 30. Depends on backend

=item 31. Depends on backend

=item 32. Depends on backend

=item 33. Depends on backend

=item 34. Depends on backend

=item 35. Depends on backend

=item 36. Depends on backend

=item 37. Depends on backend

=item 38. Limited choice of 1 ASCII style and 1 UTF style

=item 39. Slightly slower than Text::Table::Tiny

=item 40. But this module can pass rendering to other module like Text::UnicodeBox::Table

=item 41. Newlines stripped

=item 42. Does not draw borders

=item 43. The fastest among the others in this list

=item 44. Irrelevant

=item 45. But make sure your CSV parser can handle multiline cell

=item 46. Not converted to HTML color elements

=item 47. Not converted to HTML color elements

=item 48. Irrelevant

=back

=head1 BENCHMARKED MODULES

Version numbers shown below are the versions used when running the sample benchmark.

L<Text::Table::Any> 0.114

L<Text::SimpleTable> 2.07

L<Text::UnicodeBox::Table>

L<Text::Table::Manifold> 1.03

L<Text::ANSITable> 0.608

L<Text::ASCIITable> 0.22

L<Text::FormatTable> 1.03

L<Text::MarkdownTable> 0.3.1

L<Text::Table> 1.134

L<Text::Table::Tiny> 1.03

L<Text::Table::TinyBorderStyle> 0.005

L<Text::Table::More> 0.025

L<Text::Table::Sprintf> 0.006

L<Text::Table::TinyColor> 0.002

L<Text::Table::TinyColorWide> 0.001

L<Text::Table::TinyWide> 0.001

L<Text::Table::Org> 0.031

L<Text::Table::CSV> 0.023

L<Text::Table::HTML> 0.010

L<Text::Table::HTML::DataTables> 0.012

L<Text::TabularDisplay> 1.38

=head1 BENCHMARK PARTICIPANTS

=over

=item * Text::Table::Any (perl_code)

L<Text::Table::Any>



=item * Text::SimpleTable (perl_code)

L<Text::SimpleTable>



=item * Text::UnicodeBox::Table (perl_code)

L<Text::UnicodeBox::Table>



=item * Text::Table::Manifold (perl_code)

L<Text::Table::Manifold>



=item * Text::ANSITable (perl_code)

L<Text::ANSITable>



=item * Text::ASCIITable (perl_code)

L<Text::ASCIITable>



=item * Text::FormatTable (perl_code)

L<Text::FormatTable>



=item * Text::MarkdownTable (perl_code)

L<Text::MarkdownTable>



=item * Text::Table (perl_code)

L<Text::Table>



=item * Text::Table::Tiny (perl_code)

L<Text::Table::Tiny>



=item * Text::Table::TinyBorderStyle (perl_code)

L<Text::Table::TinyBorderStyle>



=item * Text::Table::More (perl_code)

L<Text::Table::More>



=item * Text::Table::Sprintf (perl_code)

L<Text::Table::Sprintf>



=item * Text::Table::TinyColor (perl_code)

L<Text::Table::TinyColor>



=item * Text::Table::TinyColorWide (perl_code)

L<Text::Table::TinyColorWide>



=item * Text::Table::TinyWide (perl_code)

L<Text::Table::TinyWide>



=item * Text::Table::Org (perl_code)

L<Text::Table::Org>



=item * Text::Table::CSV (perl_code)

L<Text::Table::CSV>



=item * Text::Table::HTML (perl_code)

L<Text::Table::HTML>



=item * Text::Table::HTML::DataTables (perl_code)

L<Text::Table::HTML::DataTables>



=item * Text::TabularDisplay (perl_code)

L<Text::TabularDisplay>



=back

=head1 BENCHMARK DATASETS

=over

=item * tiny (1x1)

=item * small (3x5)

=item * wide (30x5)

=item * long (3x300)

=item * large (30x300)

=item * multiline data (2x1) (not included by default)

=item * wide char data (1x2) (not included by default)

=item * color data (1x2) (not included by default)

=back

=head1 SAMPLE BENCHMARK RESULTS

Run on: perl: I<< v5.34.0 >>, CPU: I<< Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz (2 cores) >>, OS: I<< GNU/Linux Ubuntu version 20.04 >>, OS kernel: I<< Linux version 5.4.0-91-generic >>.

Benchmark with default options (C<< bencher --cpanmodules-module TextTable >>):

 #table1#
 {dataset=>"large (30x300)"}
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | participant                   | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | Text::UnicodeBox::Table       |       1   |     980   |                 0.00% |             32984.80% |   0.0085  |      20 |
 | Text::ANSITable               |       2   |     500   |               106.59% |             15914.37% |   0.0054  |      20 |
 | Text::Table::More             |       2.8 |     350   |               175.52% |             11908.00% |   0.0018  |      20 |
 | Text::ASCIITable              |      10   |     100   |               883.88% |              3262.69% |   0.001   |      20 |
 | Text::FormatTable             |      16   |      63   |              1456.20% |              2025.99% |   0.00023 |      23 |
 | Text::Table::TinyColorWide    |      20   |      60   |              1485.47% |              1986.75% |   0.00071 |      20 |
 | Text::Table::TinyWide         |      20   |      40   |              2164.65% |              1360.92% |   0.00047 |      20 |
 | Text::SimpleTable             |      33   |      31   |              3074.33% |               942.26% | 3.5e-05   |      21 |
 | Text::Table::Manifold         |      30   |      30   |              3114.15% |               929.35% |   0.00068 |      20 |
 | Text::Table::Tiny             |      38   |      26   |              3638.79% |               784.91% |   0.00014 |      20 |
 | Text::TabularDisplay          |      47   |      21   |              4511.67% |               617.41% | 4.7e-05   |      23 |
 | Text::Table::HTML             |      58   |      17   |              5520.76% |               488.62% | 3.8e-05   |      20 |
 | Text::Table::TinyColor        |      60   |      20   |              5578.82% |               482.60% |   0.00024 |      20 |
 | Text::MarkdownTable           |      70   |      10   |              6860.53% |               375.32% |   0.00018 |      20 |
 | Text::Table                   |      80   |      10   |              7859.90% |               315.64% |   0.00013 |      20 |
 | Text::Table::HTML::DataTables |     130   |       7.8 |             12361.49% |               165.50% | 1.3e-05   |      20 |
 | Text::Table::Org              |     200   |       6   |             14923.75% |               120.22% |   0.00029 |      21 |
 | Text::Table::TinyBorderStyle  |     220   |       4.6 |             21244.12% |                55.01% | 1.2e-05   |      20 |
 | Text::Table::CSV              |     220   |       4.5 |             21542.65% |                52.87% | 9.4e-06   |      20 |
 | Text::Table::Any              |     300   |       3   |             30477.53% |                 8.20% | 8.4e-05   |      20 |
 | Text::Table::Sprintf          |     300   |       3   |             32984.80% |                 0.00% | 4.1e-05   |      20 |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+

Formatted as L<Benchmark.pm|Benchmark> result:

                                  Rate  Text::UnicodeBox::Table  Text::ANSITable  Text::Table::More  Text::ASCIITable  Text::FormatTable  Text::Table::TinyColorWide  Text::Table::TinyWide  Text::SimpleTable  Text::Table::Manifold  Text::Table::Tiny  Text::TabularDisplay  Text::Table::TinyColor  Text::Table::HTML  Text::MarkdownTable  Text::Table  Text::Table::HTML::DataTables  Text::Table::Org  Text::Table::TinyBorderStyle  Text::Table::CSV  Text::Table::Any  Text::Table::Sprintf 
  Text::UnicodeBox::Table          1/s                       --             -48%               -64%              -89%               -93%                        -93%                   -95%               -96%                   -96%               -97%                  -97%                    -97%               -98%                 -98%         -98%                           -99%              -99%                          -99%              -99%              -99%                  -99% 
  Text::ANSITable                  2/s                      96%               --               -30%              -80%               -87%                        -88%                   -92%               -93%                   -94%               -94%                  -95%                    -96%               -96%                 -98%         -98%                           -98%              -98%                          -99%              -99%              -99%                  -99% 
  Text::Table::More              2.8/s                     179%              42%                 --              -71%               -82%                        -82%                   -88%               -91%                   -91%               -92%                  -94%                    -94%               -95%                 -97%         -97%                           -97%              -98%                          -98%              -98%              -99%                  -99% 
  Text::ASCIITable                10/s                     880%             400%               250%                --               -37%                        -40%                   -60%               -69%                   -70%               -74%                  -79%                    -80%               -83%                 -90%         -90%                           -92%              -94%                          -95%              -95%              -97%                  -97% 
  Text::FormatTable               16/s                    1455%             693%               455%               58%                 --                         -4%                   -36%               -50%                   -52%               -58%                  -66%                    -68%               -73%                 -84%         -84%                           -87%              -90%                          -92%              -92%              -95%                  -95% 
  Text::Table::TinyColorWide      20/s                    1533%             733%               483%               66%                 5%                          --                   -33%               -48%                   -50%               -56%                  -65%                    -66%               -71%                 -83%         -83%                           -87%              -90%                          -92%              -92%              -95%                  -95% 
  Text::Table::TinyWide           20/s                    2350%            1150%               775%              150%                57%                         50%                     --               -22%                   -25%               -35%                  -47%                    -50%               -57%                 -75%         -75%                           -80%              -85%                          -88%              -88%              -92%                  -92% 
  Text::SimpleTable               33/s                    3061%            1512%              1029%              222%               103%                         93%                    29%                 --                    -3%               -16%                  -32%                    -35%               -45%                 -67%         -67%                           -74%              -80%                          -85%              -85%              -90%                  -90% 
  Text::Table::Manifold           30/s                    3166%            1566%              1066%              233%               110%                        100%                    33%                 3%                     --               -13%                  -30%                    -33%               -43%                 -66%         -66%                           -74%              -80%                          -84%              -85%              -90%                  -90% 
  Text::Table::Tiny               38/s                    3669%            1823%              1246%              284%               142%                        130%                    53%                19%                    15%                 --                  -19%                    -23%               -34%                 -61%         -61%                           -70%              -76%                          -82%              -82%              -88%                  -88% 
  Text::TabularDisplay            47/s                    4566%            2280%              1566%              376%               200%                        185%                    90%                47%                    42%                23%                    --                     -4%               -19%                 -52%         -52%                           -62%              -71%                          -78%              -78%              -85%                  -85% 
  Text::Table::TinyColor          60/s                    4800%            2400%              1650%              400%               215%                        200%                   100%                55%                    50%                30%                    5%                      --               -15%                 -50%         -50%                           -61%              -70%                          -77%              -77%              -85%                  -85% 
  Text::Table::HTML               58/s                    5664%            2841%              1958%              488%               270%                        252%                   135%                82%                    76%                52%                   23%                     17%                 --                 -41%         -41%                           -54%              -64%                          -72%              -73%              -82%                  -82% 
  Text::MarkdownTable             70/s                    9700%            4900%              3400%              900%               530%                        500%                   300%               210%                   200%               160%                  110%                    100%                70%                   --           0%                           -21%              -40%                          -54%              -55%              -70%                  -70% 
  Text::Table                     80/s                    9700%            4900%              3400%              900%               530%                        500%                   300%               210%                   200%               160%                  110%                    100%                70%                   0%           --                           -21%              -40%                          -54%              -55%              -70%                  -70% 
  Text::Table::HTML::DataTables  130/s                   12464%            6310%              4387%             1182%               707%                        669%                   412%               297%                   284%               233%                  169%                    156%               117%                  28%          28%                             --              -23%                          -41%              -42%              -61%                  -61% 
  Text::Table::Org               200/s                   16233%            8233%              5733%             1566%               950%                        900%                   566%               416%                   400%               333%                  250%                    233%               183%                  66%          66%                            30%                --                          -23%              -25%              -50%                  -50% 
  Text::Table::TinyBorderStyle   220/s                   21204%           10769%              7508%             2073%              1269%                       1204%                   769%               573%                   552%               465%                  356%                    334%               269%                 117%         117%                            69%               30%                            --               -2%              -34%                  -34% 
  Text::Table::CSV               220/s                   21677%           11011%              7677%             2122%              1300%                       1233%                   788%               588%                   566%               477%                  366%                    344%               277%                 122%         122%                            73%               33%                            2%                --              -33%                  -33% 
  Text::Table::Any               300/s                   32566%           16566%             11566%             3233%              2000%                       1900%                  1233%               933%                   900%               766%                  600%                    566%               466%                 233%         233%                           160%              100%                           53%               50%                --                    0% 
  Text::Table::Sprintf           300/s                   32566%           16566%             11566%             3233%              2000%                       1900%                  1233%               933%                   900%               766%                  600%                    566%               466%                 233%         233%                           160%              100%                           53%               50%                0%                    -- 
 
 Legends:
   Text::ANSITable: participant=Text::ANSITable
   Text::ASCIITable: participant=Text::ASCIITable
   Text::FormatTable: participant=Text::FormatTable
   Text::MarkdownTable: participant=Text::MarkdownTable
   Text::SimpleTable: participant=Text::SimpleTable
   Text::Table: participant=Text::Table
   Text::Table::Any: participant=Text::Table::Any
   Text::Table::CSV: participant=Text::Table::CSV
   Text::Table::HTML: participant=Text::Table::HTML
   Text::Table::HTML::DataTables: participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: participant=Text::Table::Manifold
   Text::Table::More: participant=Text::Table::More
   Text::Table::Org: participant=Text::Table::Org
   Text::Table::Sprintf: participant=Text::Table::Sprintf
   Text::Table::Tiny: participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: participant=Text::Table::TinyWide
   Text::TabularDisplay: participant=Text::TabularDisplay
   Text::UnicodeBox::Table: participant=Text::UnicodeBox::Table

=for html <img src="data:image/png;base64, " />


 #table2#
 {dataset=>"long (3x300)"}
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | participant                   | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | Text::UnicodeBox::Table       |       8.1 |   120     |                 0.00% |             36473.49% |   0.00084 |      20 |
 | Text::Table::More             |      20   |    60     |               120.32% |             16500.15% |   0.00079 |      20 |
 | Text::ANSITable               |      19   |    52     |               138.95% |             15205.67% |   0.0005  |      20 |
 | Text::ASCIITable              |     100   |    10     |              1178.21% |              2761.30% |   0.00019 |      21 |
 | Text::FormatTable             |     100   |     8     |              1406.88% |              2327.10% |   0.00021 |      20 |
 | Text::Table::TinyColorWide    |     160   |     6.1   |              1935.67% |              1696.63% | 4.1e-05   |      20 |
 | Text::Table::TinyWide         |     220   |     4.5   |              2658.16% |              1226.01% | 3.3e-05   |      21 |
 | Text::SimpleTable             |     280   |     3.5   |              3421.37% |               938.61% | 3.3e-05   |      20 |
 | Text::MarkdownTable           |     300   |     3     |              4092.38% |               772.38% | 7.9e-05   |      20 |
 | Text::Table::Manifold         |     340   |     2.9   |              4103.12% |               770.15% | 1.4e-05   |      20 |
 | Text::TabularDisplay          |     350   |     2.9   |              4220.60% |               746.49% | 1.5e-05   |      20 |
 | Text::Table::Tiny             |     370   |     2.7   |              4431.41% |               707.11% | 2.2e-05   |      20 |
 | Text::Table                   |     400   |     3     |              4703.50% |               661.39% | 6.6e-05   |      20 |
 | Text::Table::TinyColor        |     610   |     1.6   |              7411.08% |               386.93% | 2.2e-06   |      20 |
 | Text::Table::HTML             |     660   |     1.5   |              8088.89% |               346.62% | 2.5e-06   |      20 |
 | Text::Table::HTML::DataTables |    1000   |     0.98  |             12537.94% |               189.39% | 1.4e-06   |      20 |
 | Text::Table::TinyBorderStyle  |    1300   |     0.75  |             16280.36% |               123.28% | 2.7e-06   |      20 |
 | Text::Table::Org              |    1700   |     0.59  |             20844.22% |                74.62% | 1.1e-06   |      20 |
 | Text::Table::CSV              |    1700   |     0.58  |             21345.46% |                70.54% | 1.7e-06   |      21 |
 | Text::Table::Any              |    2600   |     0.39  |             31913.18% |                14.25% | 3.1e-06   |      21 |
 | Text::Table::Sprintf          |    2960   |     0.338 |             36473.49% |                 0.00% | 5.3e-08   |      20 |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+

Formatted as L<Benchmark.pm|Benchmark> result:

                                   Rate  Text::UnicodeBox::Table  Text::Table::More  Text::ANSITable  Text::ASCIITable  Text::FormatTable  Text::Table::TinyColorWide  Text::Table::TinyWide  Text::SimpleTable  Text::MarkdownTable  Text::Table  Text::Table::Manifold  Text::TabularDisplay  Text::Table::Tiny  Text::Table::TinyColor  Text::Table::HTML  Text::Table::HTML::DataTables  Text::Table::TinyBorderStyle  Text::Table::Org  Text::Table::CSV  Text::Table::Any  Text::Table::Sprintf 
  Text::UnicodeBox::Table         8.1/s                       --               -50%             -56%              -91%               -93%                        -94%                   -96%               -97%                 -97%         -97%                   -97%                  -97%               -97%                    -98%               -98%                           -99%                          -99%              -99%              -99%              -99%                  -99% 
  Text::Table::More                20/s                     100%                 --             -13%              -83%               -86%                        -89%                   -92%               -94%                 -95%         -95%                   -95%                  -95%               -95%                    -97%               -97%                           -98%                          -98%              -99%              -99%              -99%                  -99% 
  Text::ANSITable                  19/s                     130%                15%               --              -80%               -84%                        -88%                   -91%               -93%                 -94%         -94%                   -94%                  -94%               -94%                    -96%               -97%                           -98%                          -98%              -98%              -98%              -99%                  -99% 
  Text::ASCIITable                100/s                    1100%               500%             420%                --               -19%                        -39%                   -55%               -65%                 -70%         -70%                   -71%                  -71%               -73%                    -84%               -85%                           -90%                          -92%              -94%              -94%              -96%                  -96% 
  Text::FormatTable               100/s                    1400%               650%             550%               25%                 --                        -23%                   -43%               -56%                 -62%         -62%                   -63%                  -63%               -66%                    -80%               -81%                           -87%                          -90%              -92%              -92%              -95%                  -95% 
  Text::Table::TinyColorWide      160/s                    1867%               883%             752%               63%                31%                          --                   -26%               -42%                 -50%         -50%                   -52%                  -52%               -55%                    -73%               -75%                           -83%                          -87%              -90%              -90%              -93%                  -94% 
  Text::Table::TinyWide           220/s                    2566%              1233%            1055%              122%                77%                         35%                     --               -22%                 -33%         -33%                   -35%                  -35%               -39%                    -64%               -66%                           -78%                          -83%              -86%              -87%              -91%                  -92% 
  Text::SimpleTable               280/s                    3328%              1614%            1385%              185%               128%                         74%                    28%                 --                 -14%         -14%                   -17%                  -17%               -22%                    -54%               -57%                           -72%                          -78%              -83%              -83%              -88%                  -90% 
  Text::MarkdownTable             300/s                    3900%              1900%            1633%              233%               166%                        103%                    50%                16%                   --           0%                    -3%                   -3%                -9%                    -46%               -50%                           -67%                          -75%              -80%              -80%              -87%                  -88% 
  Text::Table                     400/s                    3900%              1900%            1633%              233%               166%                        103%                    50%                16%                   0%           --                    -3%                   -3%                -9%                    -46%               -50%                           -67%                          -75%              -80%              -80%              -87%                  -88% 
  Text::Table::Manifold           340/s                    4037%              1968%            1693%              244%               175%                        110%                    55%                20%                   3%           3%                     --                    0%                -6%                    -44%               -48%                           -66%                          -74%              -79%              -80%              -86%                  -88% 
  Text::TabularDisplay            350/s                    4037%              1968%            1693%              244%               175%                        110%                    55%                20%                   3%           3%                     0%                    --                -6%                    -44%               -48%                           -66%                          -74%              -79%              -80%              -86%                  -88% 
  Text::Table::Tiny               370/s                    4344%              2122%            1825%              270%               196%                        125%                    66%                29%                  11%          11%                     7%                    7%                 --                    -40%               -44%                           -63%                          -72%              -78%              -78%              -85%                  -87% 
  Text::Table::TinyColor          610/s                    7400%              3650%            3150%              525%               400%                        281%                   181%               118%                  87%          87%                    81%                   81%                68%                      --                -6%                           -38%                          -53%              -63%              -63%              -75%                  -78% 
  Text::Table::HTML               660/s                    7900%              3900%            3366%              566%               433%                        306%                   200%               133%                 100%         100%                    93%                   93%                80%                      6%                 --                           -34%                          -50%              -60%              -61%              -74%                  -77% 
  Text::Table::HTML::DataTables  1000/s                   12144%              6022%            5206%              920%               716%                        522%                   359%               257%                 206%         206%                   195%                  195%               175%                     63%                53%                             --                          -23%              -39%              -40%              -60%                  -65% 
  Text::Table::TinyBorderStyle   1300/s                   15900%              7900%            6833%             1233%               966%                        713%                   500%               366%                 300%         300%                   286%                  286%               260%                    113%               100%                            30%                            --              -21%              -22%              -48%                  -54% 
  Text::Table::Org               1700/s                   20238%             10069%            8713%             1594%              1255%                        933%                   662%               493%                 408%         408%                   391%                  391%               357%                    171%               154%                            66%                           27%                --               -1%              -33%                  -42% 
  Text::Table::CSV               1700/s                   20589%             10244%            8865%             1624%              1279%                        951%                   675%               503%                 417%         417%                   400%                  400%               365%                    175%               158%                            68%                           29%                1%                --              -32%                  -41% 
  Text::Table::Any               2600/s                   30669%             15284%           13233%             2464%              1951%                       1464%                  1053%               797%                 669%         669%                   643%                  643%               592%                    310%               284%                           151%                           92%               51%               48%                --                  -13% 
  Text::Table::Sprintf           2960/s                   35402%             17651%           15284%             2858%              2266%                       1704%                  1231%               935%                 787%         787%                   757%                  757%               698%                    373%               343%                           189%                          121%               74%               71%               15%                    -- 
 
 Legends:
   Text::ANSITable: participant=Text::ANSITable
   Text::ASCIITable: participant=Text::ASCIITable
   Text::FormatTable: participant=Text::FormatTable
   Text::MarkdownTable: participant=Text::MarkdownTable
   Text::SimpleTable: participant=Text::SimpleTable
   Text::Table: participant=Text::Table
   Text::Table::Any: participant=Text::Table::Any
   Text::Table::CSV: participant=Text::Table::CSV
   Text::Table::HTML: participant=Text::Table::HTML
   Text::Table::HTML::DataTables: participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: participant=Text::Table::Manifold
   Text::Table::More: participant=Text::Table::More
   Text::Table::Org: participant=Text::Table::Org
   Text::Table::Sprintf: participant=Text::Table::Sprintf
   Text::Table::Tiny: participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: participant=Text::Table::TinyWide
   Text::TabularDisplay: participant=Text::TabularDisplay
   Text::UnicodeBox::Table: participant=Text::UnicodeBox::Table

=for html <img src="data:image/png;base64, " />


 #table3#
 {dataset=>"small (3x5)"}
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | participant                   | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | Text::UnicodeBox::Table       |     200   | 6         |                 0.00% |             57200.69% |   0.00016 |      20 |
 | Text::ANSITable               |     700   | 1.4       |               327.06% |             13317.43% |   5e-06   |      21 |
 | Text::Table::More             |     960   | 1         |               481.52% |              9753.56% | 3.5e-06   |      24 |
 | Text::Table::TinyBorderStyle  |    3000   | 0.3       |              1817.31% |              2888.60% | 7.1e-06   |      20 |
 | Text::ASCIITable              |    4000   | 0.2       |              2604.90% |              2018.40% | 3.1e-06   |      20 |
 | Text::Table                   |    6400   | 0.16      |              3764.07% |              1382.91% | 8.8e-07   |      21 |
 | Text::FormatTable             |    6900   | 0.14      |              4098.28% |              1264.86% | 2.1e-07   |      20 |
 | Text::Table::Manifold         |    7600   | 0.13      |              4501.95% |              1145.14% | 4.8e-07   |      20 |
 | Text::Table::TinyColorWide    |    7900   | 0.13      |              4692.26% |              1095.69% | 2.1e-07   |      21 |
 | Text::SimpleTable             |   10000   | 0.09      |              6693.33% |               743.48% | 1.9e-06   |      22 |
 | Text::Table::TinyWide         |   11200   | 0.089     |              6730.07% |               738.95% |   8e-08   |      20 |
 | Text::MarkdownTable           |   12000   | 0.084     |              7176.55% |               687.47% | 4.5e-07   |      20 |
 | Text::Table::Tiny             |   10000   | 0.08      |              7941.48% |               612.56% | 1.1e-06   |      20 |
 | Text::Table::HTML::DataTables |   16000   | 0.064     |              9325.07% |               507.96% | 9.9e-08   |      23 |
 | Text::TabularDisplay          |   15600   | 0.064     |              9401.21% |               503.09% | 2.5e-08   |      23 |
 | Text::Table::TinyColor        |   24000   | 0.0416    |             14492.65% |               292.67% |   4e-08   |      20 |
 | Text::Table::HTML             |   32106.5 | 0.0311463 |             19411.77% |               193.67% |   0       |      20 |
 | Text::Table::Org              |   52000   | 0.019     |             31554.46% |                81.02% | 2.7e-08   |      20 |
 | Text::Table::CSV              |   78700   | 0.0127    |             47736.28% |                19.78% | 5.8e-09   |      26 |
 | Text::Table::Any              |   81700   | 0.0122    |             49565.77% |                15.37% | 3.2e-09   |      22 |
 | Text::Table::Sprintf          |   94000   | 0.011     |             57200.69% |                 0.00% | 1.3e-08   |      20 |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+

Formatted as L<Benchmark.pm|Benchmark> result:

                                      Rate  Text::UnicodeBox::Table  Text::ANSITable  Text::Table::More  Text::Table::TinyBorderStyle  Text::ASCIITable  Text::Table  Text::FormatTable  Text::Table::Manifold  Text::Table::TinyColorWide  Text::SimpleTable  Text::Table::TinyWide  Text::MarkdownTable  Text::Table::Tiny  Text::Table::HTML::DataTables  Text::TabularDisplay  Text::Table::TinyColor  Text::Table::HTML  Text::Table::Org  Text::Table::CSV  Text::Table::Any  Text::Table::Sprintf 
  Text::UnicodeBox::Table            200/s                       --             -76%               -83%                          -95%              -96%         -97%               -97%                   -97%                        -97%               -98%                   -98%                 -98%               -98%                           -98%                  -98%                    -99%               -99%              -99%              -99%              -99%                  -99% 
  Text::ANSITable                    700/s                     328%               --               -28%                          -78%              -85%         -88%               -90%                   -90%                        -90%               -93%                   -93%                 -94%               -94%                           -95%                  -95%                    -97%               -97%              -98%              -99%              -99%                  -99% 
  Text::Table::More                  960/s                     500%              39%                 --                          -70%              -80%         -84%               -86%                   -87%                        -87%               -91%                   -91%                 -91%               -92%                           -93%                  -93%                    -95%               -96%              -98%              -98%              -98%                  -98% 
  Text::Table::TinyBorderStyle      3000/s                    1900%             366%               233%                            --              -33%         -46%               -53%                   -56%                        -56%               -70%                   -70%                 -72%               -73%                           -78%                  -78%                    -86%               -89%              -93%              -95%              -95%                  -96% 
  Text::ASCIITable                  4000/s                    2900%             599%               400%                           49%                --         -20%               -29%                   -35%                        -35%               -55%                   -55%                 -58%               -60%                           -68%                  -68%                    -79%               -84%              -90%              -93%              -93%                  -94% 
  Text::Table                       6400/s                    3650%             775%               525%                           87%               25%           --               -12%                   -18%                        -18%               -43%                   -44%                 -47%               -50%                           -60%                  -60%                    -74%               -80%              -88%              -92%              -92%                  -93% 
  Text::FormatTable                 6900/s                    4185%             899%               614%                          114%               42%          14%                 --                    -7%                         -7%               -35%                   -36%                 -40%               -42%                           -54%                  -54%                    -70%               -77%              -86%              -90%              -91%                  -92% 
  Text::Table::Manifold             7600/s                    4515%             976%               669%                          130%               53%          23%                 7%                     --                          0%               -30%                   -31%                 -35%               -38%                           -50%                  -50%                    -68%               -76%              -85%              -90%              -90%                  -91% 
  Text::Table::TinyColorWide        7900/s                    4515%             976%               669%                          130%               53%          23%                 7%                     0%                          --               -30%                   -31%                 -35%               -38%                           -50%                  -50%                    -68%               -76%              -85%              -90%              -90%                  -91% 
  Text::SimpleTable                10000/s                    6566%            1455%              1011%                          233%              122%          77%                55%                    44%                         44%                 --                    -1%                  -6%               -11%                           -28%                  -28%                    -53%               -65%              -78%              -85%              -86%                  -87% 
  Text::Table::TinyWide            11200/s                    6641%            1473%              1023%                          237%              124%          79%                57%                    46%                         46%                 1%                     --                  -5%               -10%                           -28%                  -28%                    -53%               -65%              -78%              -85%              -86%                  -87% 
  Text::MarkdownTable              12000/s                    7042%            1566%              1090%                          257%              138%          90%                66%                    54%                         54%                 7%                     5%                   --                -4%                           -23%                  -23%                    -50%               -62%              -77%              -84%              -85%                  -86% 
  Text::Table::Tiny                10000/s                    7400%            1650%              1150%                          275%              150%         100%                75%                    62%                         62%                12%                    11%                   5%                 --                           -19%                  -19%                    -48%               -61%              -76%              -84%              -84%                  -86% 
  Text::Table::HTML::DataTables    16000/s                    9275%            2087%              1462%                          368%              212%         150%               118%                   103%                        103%                40%                    39%                  31%                25%                             --                    0%                    -35%               -51%              -70%              -80%              -80%                  -82% 
  Text::TabularDisplay             15600/s                    9275%            2087%              1462%                          368%              212%         150%               118%                   103%                        103%                40%                    39%                  31%                25%                             0%                    --                    -35%               -51%              -70%              -80%              -80%                  -82% 
  Text::Table::TinyColor           24000/s                   14323%            3265%              2303%                          621%              380%         284%               236%                   212%                        212%               116%                   113%                 101%                92%                            53%                   53%                      --               -25%              -54%              -69%              -70%                  -73% 
  Text::Table::HTML              32106.5/s                   19163%            4394%              3110%                          863%              542%         413%               349%                   317%                        317%               188%                   185%                 169%               156%                           105%                  105%                     33%                 --              -38%              -59%              -60%                  -64% 
  Text::Table::Org                 52000/s                   31478%            7268%              5163%                         1478%              952%         742%               636%                   584%                        584%               373%                   368%                 342%               321%                           236%                  236%                    118%                63%                --              -33%              -35%                  -42% 
  Text::Table::CSV                 78700/s                   47144%           10923%              7774%                         2262%             1474%        1159%              1002%                   923%                        923%               608%                   600%                 561%               529%                           403%                  403%                    227%               145%               49%                --               -3%                  -13% 
  Text::Table::Any                 81700/s                   49080%           11375%              8096%                         2359%             1539%        1211%              1047%                   965%                        965%               637%                   629%                 588%               555%                           424%                  424%                    240%               155%               55%                4%                --                   -9% 
  Text::Table::Sprintf             94000/s                   54445%           12627%              8990%                         2627%             1718%        1354%              1172%                  1081%                       1081%               718%                   709%                 663%               627%                           481%                  481%                    278%               183%               72%               15%               10%                    -- 
 
 Legends:
   Text::ANSITable: participant=Text::ANSITable
   Text::ASCIITable: participant=Text::ASCIITable
   Text::FormatTable: participant=Text::FormatTable
   Text::MarkdownTable: participant=Text::MarkdownTable
   Text::SimpleTable: participant=Text::SimpleTable
   Text::Table: participant=Text::Table
   Text::Table::Any: participant=Text::Table::Any
   Text::Table::CSV: participant=Text::Table::CSV
   Text::Table::HTML: participant=Text::Table::HTML
   Text::Table::HTML::DataTables: participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: participant=Text::Table::Manifold
   Text::Table::More: participant=Text::Table::More
   Text::Table::Org: participant=Text::Table::Org
   Text::Table::Sprintf: participant=Text::Table::Sprintf
   Text::Table::Tiny: participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: participant=Text::Table::TinyWide
   Text::TabularDisplay: participant=Text::TabularDisplay
   Text::UnicodeBox::Table: participant=Text::UnicodeBox::Table

=for html <img src="data:image/png;base64, " />


 #table4#
 {dataset=>"tiny (1x1)"}
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | participant                   | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors | samples |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+
 | Text::UnicodeBox::Table       |       400 |   3       |                 0.00% |             76394.30% | 8.4e-05 |      20 |
 | Text::ANSITable               |      2200 |   0.45    |               491.32% |             12836.29% | 6.4e-07 |      20 |
 | Text::Table::More             |      3200 |   0.31    |               739.15% |              9015.70% | 9.1e-07 |      20 |
 | Text::Table::TinyBorderStyle  |      4500 |   0.22    |              1078.26% |              6392.13% | 1.3e-06 |      22 |
 | Text::Table::Manifold         |     10000 |   0.09    |              2969.15% |              2392.36% | 1.5e-06 |      20 |
 | Text::FormatTable             |     10000 |   0.07    |              3590.40% |              1972.79% | 7.7e-07 |      20 |
 | Text::ASCIITable              |     10000 |   0.07    |              3819.94% |              1851.41% | 9.9e-07 |      20 |
 | Text::Table                   |     20000 |   0.05    |              4900.21% |              1429.82% | 9.6e-07 |      20 |
 | Text::Table::HTML::DataTables |     21000 |   0.048   |              5434.33% |              1282.18% | 1.2e-07 |      20 |
 | Text::MarkdownTable           |     20000 |   0.05    |              5697.87% |              1219.35% | 8.9e-07 |      20 |
 | Text::Table::TinyColorWide    |     45000 |   0.022   |             11759.61% |               545.00% | 2.6e-08 |      21 |
 | Text::Table::Tiny             |     52000 |   0.019   |             13686.75% |               454.84% |   6e-08 |      20 |
 | Text::SimpleTable             |     57000 |   0.017   |             14982.89% |               407.16% | 1.7e-07 |      20 |
 | Text::Table::TinyWide         |     58000 |   0.017   |             15207.88% |               399.71% | 7.8e-08 |      21 |
 | Text::TabularDisplay          |     62000 |   0.016   |             16326.67% |               365.67% | 1.8e-08 |      24 |
 | Text::Table::TinyColor        |     93000 |   0.011   |             24400.42% |               212.22% | 1.3e-08 |      20 |
 | Text::Table::Any              |    100000 |   0.01    |             25184.05% |               202.54% |   5e-07 |      20 |
 | Text::Table::Org              |    140000 |   0.007   |             37466.60% |               103.62% | 1.3e-08 |      20 |
 | Text::Table::HTML             |    157000 |   0.00636 |             41389.63% |                84.37% | 2.6e-09 |      32 |
 | Text::Table::Sprintf          |    300000 |   0.004   |             67320.30% |                13.46% | 4.8e-08 |      20 |
 | Text::Table::CSV              |    290000 |   0.0034  |             76394.30% |                 0.00% | 8.3e-09 |      20 |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+---------+---------+

Formatted as L<Benchmark.pm|Benchmark> result:

                                     Rate  Text::UnicodeBox::Table  Text::ANSITable  Text::Table::More  Text::Table::TinyBorderStyle  Text::Table::Manifold  Text::FormatTable  Text::ASCIITable  Text::Table  Text::MarkdownTable  Text::Table::HTML::DataTables  Text::Table::TinyColorWide  Text::Table::Tiny  Text::SimpleTable  Text::Table::TinyWide  Text::TabularDisplay  Text::Table::TinyColor  Text::Table::Any  Text::Table::Org  Text::Table::HTML  Text::Table::Sprintf  Text::Table::CSV 
  Text::UnicodeBox::Table           400/s                       --             -85%               -89%                          -92%                   -97%               -97%              -97%         -98%                 -98%                           -98%                        -99%               -99%               -99%                   -99%                  -99%                    -99%              -99%              -99%               -99%                  -99%              -99% 
  Text::ANSITable                  2200/s                     566%               --               -31%                          -51%                   -80%               -84%              -84%         -88%                 -88%                           -89%                        -95%               -95%               -96%                   -96%                  -96%                    -97%              -97%              -98%               -98%                  -99%              -99% 
  Text::Table::More                3200/s                     867%              45%                 --                          -29%                   -70%               -77%              -77%         -83%                 -83%                           -84%                        -92%               -93%               -94%                   -94%                  -94%                    -96%              -96%              -97%               -97%                  -98%              -98% 
  Text::Table::TinyBorderStyle     4500/s                    1263%             104%                40%                            --                   -59%               -68%              -68%         -77%                 -77%                           -78%                        -90%               -91%               -92%                   -92%                  -92%                    -95%              -95%              -96%               -97%                  -98%              -98% 
  Text::Table::Manifold           10000/s                    3233%             400%               244%                          144%                     --               -22%              -22%         -44%                 -44%                           -46%                        -75%               -78%               -81%                   -81%                  -82%                    -87%              -88%              -92%               -92%                  -95%              -96% 
  Text::FormatTable               10000/s                    4185%             542%               342%                          214%                    28%                 --                0%         -28%                 -28%                           -31%                        -68%               -72%               -75%                   -75%                  -77%                    -84%              -85%              -90%               -90%                  -94%              -95% 
  Text::ASCIITable                10000/s                    4185%             542%               342%                          214%                    28%                 0%                --         -28%                 -28%                           -31%                        -68%               -72%               -75%                   -75%                  -77%                    -84%              -85%              -90%               -90%                  -94%              -95% 
  Text::Table                     20000/s                    5900%             800%               519%                          339%                    79%                40%               40%           --                   0%                            -4%                        -56%               -62%               -65%                   -65%                  -68%                    -78%              -80%              -86%               -87%                  -92%              -93% 
  Text::MarkdownTable             20000/s                    5900%             800%               519%                          339%                    79%                40%               40%           0%                   --                            -4%                        -56%               -62%               -65%                   -65%                  -68%                    -78%              -80%              -86%               -87%                  -92%              -93% 
  Text::Table::HTML::DataTables   21000/s                    6150%             837%               545%                          358%                    87%                45%               45%           4%                   4%                             --                        -54%               -60%               -64%                   -64%                  -66%                    -77%              -79%              -85%               -86%                  -91%              -92% 
  Text::Table::TinyColorWide      45000/s                   13536%            1945%              1309%                          900%                   309%               218%              218%         127%                 127%                           118%                          --               -13%               -22%                   -22%                  -27%                    -50%              -54%              -68%               -71%                  -81%              -84% 
  Text::Table::Tiny               52000/s                   15689%            2268%              1531%                         1057%                   373%               268%              268%         163%                 163%                           152%                         15%                 --               -10%                   -10%                  -15%                    -42%              -47%              -63%               -66%                  -78%              -82% 
  Text::SimpleTable               57000/s                   17547%            2547%              1723%                         1194%                   429%               311%              311%         194%                 194%                           182%                         29%                11%                 --                     0%                   -5%                    -35%              -41%              -58%               -62%                  -76%              -80% 
  Text::Table::TinyWide           58000/s                   17547%            2547%              1723%                         1194%                   429%               311%              311%         194%                 194%                           182%                         29%                11%                 0%                     --                   -5%                    -35%              -41%              -58%               -62%                  -76%              -80% 
  Text::TabularDisplay            62000/s                   18650%            2712%              1837%                         1275%                   462%               337%              337%         212%                 212%                           200%                         37%                18%                 6%                     6%                    --                    -31%              -37%              -56%               -60%                  -75%              -78% 
  Text::Table::TinyColor          93000/s                   27172%            3990%              2718%                         1900%                   718%               536%              536%         354%                 354%                           336%                        100%                72%                54%                    54%                   45%                      --               -9%              -36%               -42%                  -63%              -69% 
  Text::Table::Any               100000/s                   29900%            4400%              3000%                         2100%                   800%               600%              600%         400%                 400%                           380%                        119%                89%                70%                    70%                   60%                      9%                --              -30%               -36%                  -60%              -66% 
  Text::Table::Org               140000/s                   42757%            6328%              4328%                         3042%                  1185%               900%              900%         614%                 614%                           585%                        214%               171%               142%                   142%                  128%                     57%               42%                --                -9%                  -42%              -51% 
  Text::Table::HTML              157000/s                   47069%            6975%              4774%                         3359%                  1315%              1000%             1000%         686%                 686%                           654%                        245%               198%               167%                   167%                  151%                     72%               57%               10%                 --                  -37%              -46% 
  Text::Table::Sprintf           300000/s                   74900%           11150%              7650%                         5400%                  2150%              1650%             1650%        1150%                1150%                          1100%                        450%               375%               325%                   325%                  300%                    175%              150%               75%                59%                    --              -15% 
  Text::Table::CSV               290000/s                   88135%           13135%              9017%                         6370%                  2547%              1958%             1958%        1370%                1370%                          1311%                        547%               458%               400%                   400%                  370%                    223%              194%              105%                87%                   17%                -- 
 
 Legends:
   Text::ANSITable: participant=Text::ANSITable
   Text::ASCIITable: participant=Text::ASCIITable
   Text::FormatTable: participant=Text::FormatTable
   Text::MarkdownTable: participant=Text::MarkdownTable
   Text::SimpleTable: participant=Text::SimpleTable
   Text::Table: participant=Text::Table
   Text::Table::Any: participant=Text::Table::Any
   Text::Table::CSV: participant=Text::Table::CSV
   Text::Table::HTML: participant=Text::Table::HTML
   Text::Table::HTML::DataTables: participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: participant=Text::Table::Manifold
   Text::Table::More: participant=Text::Table::More
   Text::Table::Org: participant=Text::Table::Org
   Text::Table::Sprintf: participant=Text::Table::Sprintf
   Text::Table::Tiny: participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: participant=Text::Table::TinyWide
   Text::TabularDisplay: participant=Text::TabularDisplay
   Text::UnicodeBox::Table: participant=Text::UnicodeBox::Table

=for html <img src="data:image/png;base64, " />


 #table5#
 {dataset=>"wide (30x5)"}
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | participant                   | rate (/s) | time (ms) | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+
 | Text::UnicodeBox::Table       |        38 |   27      |                 0.00% |             40512.32% |   0.0002  |      21 |
 | Text::Table::More             |        70 |   10      |                86.60% |             21664.71% |   0.00051 |      20 |
 | Text::ANSITable               |        94 |   11      |               150.42% |             16117.93% | 2.1e-05   |      20 |
 | Text::ASCIITable              |       400 |    2      |              1076.87% |              3350.89% | 4.4e-05   |      20 |
 | Text::FormatTable             |       690 |    1.4    |              1735.53% |              2112.56% |   5e-06   |      20 |
 | Text::Table::TinyColorWide    |       840 |    1.2    |              2128.10% |              1722.73% | 5.6e-06   |      20 |
 | Text::Table::TinyBorderStyle  |       800 |    1      |              2132.79% |              1718.90% | 3.7e-05   |      21 |
 | Text::Table                   |      1000 |    1      |              2485.92% |              1470.52% | 2.7e-05   |      21 |
 | Text::Table::TinyWide         |      1200 |    0.81   |              3185.19% |              1136.22% | 1.3e-06   |      20 |
 | Text::Table::Manifold         |      1600 |    0.63   |              4119.82% |               862.42% | 3.6e-06   |      20 |
 | Text::SimpleTable             |      1600 |    0.63   |              4131.88% |               859.68% | 1.8e-06   |      20 |
 | Text::Table::Tiny             |      1900 |    0.53   |              4880.95% |               715.35% | 3.1e-06   |      21 |
 | Text::TabularDisplay          |      2300 |    0.43   |              6043.25% |               561.09% | 1.4e-06   |      20 |
 | Text::Table::TinyColor        |      3000 |    0.33   |              7955.73% |               404.14% | 4.3e-07   |      20 |
 | Text::MarkdownTable           |      3300 |    0.3    |              8706.27% |               361.17% | 1.8e-06   |      20 |
 | Text::Table::HTML             |      3720 |    0.269  |              9786.13% |               310.80% | 2.1e-07   |      20 |
 | Text::Table::HTML::DataTables |      5000 |    0.2    |             13199.23% |               205.37% | 4.3e-07   |      20 |
 | Text::Table::Org              |      8600 |    0.12   |             22757.70% |                77.67% | 2.1e-07   |      20 |
 | Text::Table::CSV              |     11800 |    0.0848 |             31278.91% |                29.43% | 2.3e-08   |      26 |
 | Text::Table::Any              |     15000 |    0.069  |             38641.46% |                 4.83% | 9.4e-08   |      26 |
 | Text::Table::Sprintf          |     15300 |    0.0655 |             40512.32% |                 0.00% | 2.6e-08   |      21 |
 +-------------------------------+-----------+-----------+-----------------------+-----------------------+-----------+---------+

Formatted as L<Benchmark.pm|Benchmark> result:

                                    Rate  Text::UnicodeBox::Table  Text::ANSITable  Text::Table::More  Text::ASCIITable  Text::FormatTable  Text::Table::TinyColorWide  Text::Table::TinyBorderStyle  Text::Table  Text::Table::TinyWide  Text::Table::Manifold  Text::SimpleTable  Text::Table::Tiny  Text::TabularDisplay  Text::Table::TinyColor  Text::MarkdownTable  Text::Table::HTML  Text::Table::HTML::DataTables  Text::Table::Org  Text::Table::CSV  Text::Table::Any  Text::Table::Sprintf 
  Text::UnicodeBox::Table           38/s                       --             -59%               -62%              -92%               -94%                        -95%                          -96%         -96%                   -97%                   -97%               -97%               -98%                  -98%                    -98%                 -98%               -99%                           -99%              -99%              -99%              -99%                  -99% 
  Text::ANSITable                   94/s                     145%               --                -9%              -81%               -87%                        -89%                          -90%         -90%                   -92%                   -94%               -94%               -95%                  -96%                    -97%                 -97%               -97%                           -98%              -98%              -99%              -99%                  -99% 
  Text::Table::More                 70/s                     170%              10%                 --              -80%               -86%                        -88%                          -90%         -90%                   -91%                   -93%               -93%               -94%                  -95%                    -96%                 -97%               -97%                           -98%              -98%              -99%              -99%                  -99% 
  Text::ASCIITable                 400/s                    1250%             450%               400%                --               -30%                        -40%                          -50%         -50%                   -59%                   -68%               -68%               -73%                  -78%                    -83%                 -85%               -86%                           -90%              -94%              -95%              -96%                  -96% 
  Text::FormatTable                690/s                    1828%             685%               614%               42%                 --                        -14%                          -28%         -28%                   -42%                   -55%               -55%               -62%                  -69%                    -76%                 -78%               -80%                           -85%              -91%              -93%              -95%                  -95% 
  Text::Table::TinyColorWide       840/s                    2150%             816%               733%               66%                16%                          --                          -16%         -16%                   -32%                   -47%               -47%               -55%                  -64%                    -72%                 -75%               -77%                           -83%              -90%              -92%              -94%                  -94% 
  Text::Table::TinyBorderStyle     800/s                    2600%            1000%               900%              100%                39%                         19%                            --           0%                   -18%                   -37%               -37%               -47%                  -57%                    -67%                 -70%               -73%                           -80%              -88%              -91%              -93%                  -93% 
  Text::Table                     1000/s                    2600%            1000%               900%              100%                39%                         19%                            0%           --                   -18%                   -37%               -37%               -47%                  -57%                    -67%                 -70%               -73%                           -80%              -88%              -91%              -93%                  -93% 
  Text::Table::TinyWide           1200/s                    3233%            1258%              1134%              146%                72%                         48%                           23%          23%                     --                   -22%               -22%               -34%                  -46%                    -59%                 -62%               -66%                           -75%              -85%              -89%              -91%                  -91% 
  Text::Table::Manifold           1600/s                    4185%            1646%              1487%              217%               122%                         90%                           58%          58%                    28%                     --                 0%               -15%                  -31%                    -47%                 -52%               -57%                           -68%              -80%              -86%              -89%                  -89% 
  Text::SimpleTable               1600/s                    4185%            1646%              1487%              217%               122%                         90%                           58%          58%                    28%                     0%                 --               -15%                  -31%                    -47%                 -52%               -57%                           -68%              -80%              -86%              -89%                  -89% 
  Text::Table::Tiny               1900/s                    4994%            1975%              1786%              277%               164%                        126%                           88%          88%                    52%                    18%                18%                 --                  -18%                    -37%                 -43%               -49%                           -62%              -77%              -84%              -86%                  -87% 
  Text::TabularDisplay            2300/s                    6179%            2458%              2225%              365%               225%                        179%                          132%         132%                    88%                    46%                46%                23%                    --                    -23%                 -30%               -37%                           -53%              -72%              -80%              -83%                  -84% 
  Text::Table::TinyColor          3000/s                    8081%            3233%              2930%              506%               324%                        263%                          203%         203%                   145%                    90%                90%                60%                   30%                      --                  -9%               -18%                           -39%              -63%              -74%              -79%                  -80% 
  Text::MarkdownTable             3300/s                    8900%            3566%              3233%              566%               366%                        300%                          233%         233%                   170%                   110%               110%                76%                   43%                     10%                   --               -10%                           -33%              -60%              -71%              -77%                  -78% 
  Text::Table::HTML               3720/s                    9937%            3989%              3617%              643%               420%                        346%                          271%         271%                   201%                   134%               134%                97%                   59%                     22%                  11%                 --                           -25%              -55%              -68%              -74%                  -75% 
  Text::Table::HTML::DataTables   5000/s                   13400%            5400%              4900%              900%               599%                        499%                          400%         400%                   305%                   215%               215%               165%                  114%                     64%                  49%                34%                             --              -40%              -57%              -65%                  -67% 
  Text::Table::Org                8600/s                   22400%            9066%              8233%             1566%              1066%                        900%                          733%         733%                   575%                   425%               425%               341%                  258%                    175%                 150%               124%                            66%                --              -29%              -42%                  -45% 
  Text::Table::CSV               11800/s                   31739%           12871%             11692%             2258%              1550%                       1315%                         1079%        1079%                   855%                   642%               642%               525%                  407%                    289%                 253%               217%                           135%               41%                --              -18%                  -22% 
  Text::Table::Any               15000/s                   39030%           15842%             14392%             2798%              1928%                       1639%                         1349%        1349%                  1073%                   813%               813%               668%                  523%                    378%                 334%               289%                           189%               73%               22%                --                   -5% 
  Text::Table::Sprintf           15300/s                   41121%           16693%             15167%             2953%              2037%                       1732%                         1426%        1426%                  1136%                   861%               861%               709%                  556%                    403%                 358%               310%                           205%               83%               29%                5%                    -- 
 
 Legends:
   Text::ANSITable: participant=Text::ANSITable
   Text::ASCIITable: participant=Text::ASCIITable
   Text::FormatTable: participant=Text::FormatTable
   Text::MarkdownTable: participant=Text::MarkdownTable
   Text::SimpleTable: participant=Text::SimpleTable
   Text::Table: participant=Text::Table
   Text::Table::Any: participant=Text::Table::Any
   Text::Table::CSV: participant=Text::Table::CSV
   Text::Table::HTML: participant=Text::Table::HTML
   Text::Table::HTML::DataTables: participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: participant=Text::Table::Manifold
   Text::Table::More: participant=Text::Table::More
   Text::Table::Org: participant=Text::Table::Org
   Text::Table::Sprintf: participant=Text::Table::Sprintf
   Text::Table::Tiny: participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: participant=Text::Table::TinyWide
   Text::TabularDisplay: participant=Text::TabularDisplay
   Text::UnicodeBox::Table: participant=Text::UnicodeBox::Table

=for html <img src="data:image/png;base64, " />


Benchmark module startup overhead (C<< bencher --cpanmodules-module TextTable --module-startup >>):

 #table6#
 +-------------------------------+-----------+-------------------+-----------------------+-----------------------+-----------+---------+
 | participant                   | time (ms) | mod_overhead_time | pct_faster_vs_slowest | pct_slower_vs_fastest |  errors   | samples |
 +-------------------------------+-----------+-------------------+-----------------------+-----------------------+-----------+---------+
 | Text::UnicodeBox::Table       |     170   |             161.9 |                 0.00% |              1964.19% |   0.00076 |      20 |
 | Text::Table::Manifold         |      94   |              85.9 |                78.43% |              1056.83% |   0.00068 |      20 |
 | Text::MarkdownTable           |      60   |              51.9 |               185.25% |               623.63% |   0.0026  |      20 |
 | Text::ANSITable               |      60   |              51.9 |               194.56% |               600.77% |   0.0011  |      20 |
 | Text::Table::TinyColorWide    |      35   |              26.9 |               380.86% |               329.27% |   0.00015 |      20 |
 | Text::Table::TinyWide         |      31   |              22.9 |               439.97% |               282.28% | 4.1e-05   |      21 |
 | Text::Table                   |      30   |              21.9 |               448.34% |               276.44% |   0.0011  |      20 |
 | Text::Table::More             |      24   |              15.9 |               584.22% |               201.68% | 2.9e-05   |      20 |
 | Text::Table::Tiny             |      20   |              11.9 |               734.43% |               147.38% | 8.3e-05   |      20 |
 | Text::ASCIITable              |      19   |              10.9 |               762.11% |               139.44% |   0.00013 |      20 |
 | Text::FormatTable             |      18   |               9.9 |               823.19% |               123.59% |   0.00016 |      21 |
 | Text::Table::TinyColor        |      16   |               7.9 |               973.92% |                92.21% | 5.1e-05   |      24 |
 | Text::Table::TinyBorderStyle  |      10   |               1.9 |              1186.11% |                60.50% |   0.00015 |      20 |
 | Text::Table::Any              |      13   |               4.9 |              1237.81% |                54.30% | 3.8e-05   |      21 |
 | Text::Table::HTML             |      11   |               2.9 |              1372.11% |                40.22% | 9.2e-05   |      20 |
 | Text::TabularDisplay          |      11   |               2.9 |              1385.72% |                38.94% | 1.8e-05   |      20 |
 | Text::SimpleTable             |      11   |               2.9 |              1395.75% |                38.00% | 2.4e-05   |      20 |
 | Text::Table::HTML::DataTables |      10.7 |               2.6 |              1472.30% |                31.29% |   1e-05   |      20 |
 | Text::Table::Org              |      10   |               1.9 |              1506.60% |                28.48% | 1.8e-05   |      20 |
 | Text::Table::CSV              |       9   |               0.9 |              1710.18% |                14.03% |   0.00014 |      20 |
 | Text::Table::Sprintf          |       8.5 |               0.4 |              1865.69% |                 5.01% | 1.2e-05   |      20 |
 | perl -e1 (baseline)           |       8.1 |               0   |              1964.19% |                 0.00% | 1.2e-05   |      20 |
 +-------------------------------+-----------+-------------------+-----------------------+-----------------------+-----------+---------+


Formatted as L<Benchmark.pm|Benchmark> result:

                                    Rate  Text::UnicodeBox::Table  Text::Table::Manifold  Text::MarkdownTable  Text::ANSITable  Text::Table::TinyColorWide  Text::Table::TinyWide  Text::Table  Text::Table::More  Text::Table::Tiny  Text::ASCIITable  Text::FormatTable  Text::Table::TinyColor  Text::Table::Any  Text::Table::HTML  Text::TabularDisplay  Text::SimpleTable  Text::Table::HTML::DataTables  Text::Table::TinyBorderStyle  Text::Table::Org  Text::Table::CSV  Text::Table::Sprintf  perl -e1 (baseline) 
  Text::UnicodeBox::Table          5.9/s                       --                   -44%                 -64%             -64%                        -79%                   -81%         -82%               -85%               -88%              -88%               -89%                    -90%              -92%               -93%                  -93%               -93%                           -93%                          -94%              -94%              -94%                  -95%                 -95% 
  Text::Table::Manifold           10.6/s                      80%                     --                 -36%             -36%                        -62%                   -67%         -68%               -74%               -78%              -79%               -80%                    -82%              -86%               -88%                  -88%               -88%                           -88%                          -89%              -89%              -90%                  -90%                 -91% 
  Text::MarkdownTable             16.7/s                     183%                    56%                   --               0%                        -41%                   -48%         -50%               -60%               -66%              -68%               -70%                    -73%              -78%               -81%                  -81%               -81%                           -82%                          -83%              -83%              -85%                  -85%                 -86% 
  Text::ANSITable                 16.7/s                     183%                    56%                   0%               --                        -41%                   -48%         -50%               -60%               -66%              -68%               -70%                    -73%              -78%               -81%                  -81%               -81%                           -82%                          -83%              -83%              -85%                  -85%                 -86% 
  Text::Table::TinyColorWide      28.6/s                     385%                   168%                  71%              71%                          --                   -11%         -14%               -31%               -42%              -45%               -48%                    -54%              -62%               -68%                  -68%               -68%                           -69%                          -71%              -71%              -74%                  -75%                 -76% 
  Text::Table::TinyWide           32.3/s                     448%                   203%                  93%              93%                         12%                     --          -3%               -22%               -35%              -38%               -41%                    -48%              -58%               -64%                  -64%               -64%                           -65%                          -67%              -67%              -70%                  -72%                 -73% 
  Text::Table                     33.3/s                     466%                   213%                 100%             100%                         16%                     3%           --               -19%               -33%              -36%               -40%                    -46%              -56%               -63%                  -63%               -63%                           -64%                          -66%              -66%              -70%                  -71%                 -73% 
  Text::Table::More               41.7/s                     608%                   291%                 150%             150%                         45%                    29%          25%                 --               -16%              -20%               -25%                    -33%              -45%               -54%                  -54%               -54%                           -55%                          -58%              -58%              -62%                  -64%                 -66% 
  Text::Table::Tiny               50.0/s                     750%                   370%                 200%             200%                         75%                    55%          50%                19%                 --               -5%                -9%                    -19%              -35%               -44%                  -44%               -44%                           -46%                          -50%              -50%              -55%                  -57%                 -59% 
  Text::ASCIITable                52.6/s                     794%                   394%                 215%             215%                         84%                    63%          57%                26%                 5%                --                -5%                    -15%              -31%               -42%                  -42%               -42%                           -43%                          -47%              -47%              -52%                  -55%                 -57% 
  Text::FormatTable               55.6/s                     844%                   422%                 233%             233%                         94%                    72%          66%                33%                11%                5%                 --                    -11%              -27%               -38%                  -38%               -38%                           -40%                          -44%              -44%              -50%                  -52%                 -55% 
  Text::Table::TinyColor          62.5/s                     962%                   487%                 275%             275%                        118%                    93%          87%                50%                25%               18%                12%                      --              -18%               -31%                  -31%               -31%                           -33%                          -37%              -37%              -43%                  -46%                 -49% 
  Text::Table::Any                76.9/s                    1207%                   623%                 361%             361%                        169%                   138%         130%                84%                53%               46%                38%                     23%                --               -15%                  -15%               -15%                           -17%                          -23%              -23%              -30%                  -34%                 -37% 
  Text::Table::HTML               90.9/s                    1445%                   754%                 445%             445%                        218%                   181%         172%               118%                81%               72%                63%                     45%               18%                 --                    0%                 0%                            -2%                           -9%               -9%              -18%                  -22%                 -26% 
  Text::TabularDisplay            90.9/s                    1445%                   754%                 445%             445%                        218%                   181%         172%               118%                81%               72%                63%                     45%               18%                 0%                    --                 0%                            -2%                           -9%               -9%              -18%                  -22%                 -26% 
  Text::SimpleTable               90.9/s                    1445%                   754%                 445%             445%                        218%                   181%         172%               118%                81%               72%                63%                     45%               18%                 0%                    0%                 --                            -2%                           -9%               -9%              -18%                  -22%                 -26% 
  Text::Table::HTML::DataTables   93.5/s                    1488%                   778%                 460%             460%                        227%                   189%         180%               124%                86%               77%                68%                     49%               21%                 2%                    2%                 2%                             --                           -6%               -6%              -15%                  -20%                 -24% 
  Text::Table::TinyBorderStyle   100.0/s                    1600%                   840%                 500%             500%                        250%                   210%         200%               140%               100%               89%                80%                     60%               30%                10%                   10%                10%                             6%                            --                0%               -9%                  -15%                 -19% 
  Text::Table::Org               100.0/s                    1600%                   840%                 500%             500%                        250%                   210%         200%               140%               100%               89%                80%                     60%               30%                10%                   10%                10%                             6%                            0%                --               -9%                  -15%                 -19% 
  Text::Table::CSV               111.1/s                    1788%                   944%                 566%             566%                        288%                   244%         233%               166%               122%              111%               100%                     77%               44%                22%                   22%                22%                            18%                           11%               11%                --                   -5%                 -10% 
  Text::Table::Sprintf           117.6/s                    1900%                  1005%                 605%             605%                        311%                   264%         252%               182%               135%              123%               111%                     88%               52%                29%                   29%                29%                            25%                           17%               17%                5%                    --                  -4% 
  perl -e1 (baseline)            123.5/s                    1998%                  1060%                 640%             640%                        332%                   282%         270%               196%               146%              134%               122%                     97%               60%                35%                   35%                35%                            32%                           23%               23%               11%                    4%                   -- 
 
 Legends:
   Text::ANSITable: mod_overhead_time=51.9 participant=Text::ANSITable
   Text::ASCIITable: mod_overhead_time=10.9 participant=Text::ASCIITable
   Text::FormatTable: mod_overhead_time=9.9 participant=Text::FormatTable
   Text::MarkdownTable: mod_overhead_time=51.9 participant=Text::MarkdownTable
   Text::SimpleTable: mod_overhead_time=2.9 participant=Text::SimpleTable
   Text::Table: mod_overhead_time=21.9 participant=Text::Table
   Text::Table::Any: mod_overhead_time=4.9 participant=Text::Table::Any
   Text::Table::CSV: mod_overhead_time=0.9 participant=Text::Table::CSV
   Text::Table::HTML: mod_overhead_time=2.9 participant=Text::Table::HTML
   Text::Table::HTML::DataTables: mod_overhead_time=2.6 participant=Text::Table::HTML::DataTables
   Text::Table::Manifold: mod_overhead_time=85.9 participant=Text::Table::Manifold
   Text::Table::More: mod_overhead_time=15.9 participant=Text::Table::More
   Text::Table::Org: mod_overhead_time=1.9 participant=Text::Table::Org
   Text::Table::Sprintf: mod_overhead_time=0.4 participant=Text::Table::Sprintf
   Text::Table::Tiny: mod_overhead_time=11.9 participant=Text::Table::Tiny
   Text::Table::TinyBorderStyle: mod_overhead_time=1.9 participant=Text::Table::TinyBorderStyle
   Text::Table::TinyColor: mod_overhead_time=7.9 participant=Text::Table::TinyColor
   Text::Table::TinyColorWide: mod_overhead_time=26.9 participant=Text::Table::TinyColorWide
   Text::Table::TinyWide: mod_overhead_time=22.9 participant=Text::Table::TinyWide
   Text::TabularDisplay: mod_overhead_time=2.9 participant=Text::TabularDisplay
   Text::UnicodeBox::Table: mod_overhead_time=161.9 participant=Text::UnicodeBox::Table
   perl -e1 (baseline): mod_overhead_time=0 participant=perl -e1 (baseline)

=for html <img src="data:image/png;base64, " />


To display as an interactive HTML table on a browser, you can add option C<--format html+datatables>.

=head1 SAMPLE OUTPUTS

This section shows what the output is like for (some of the) modules:

=over

=item * L</Text::Table::Any>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::SimpleTable>

 .-----------+-----------+-----------.
 | col1      | col2      | col3      |
 +-----------+-----------+-----------+
 | row1.1    | row1.2    | row1.3    |
 | row2.1    | row2.2    | row2.3    |
 | row3.1    | row3.2    | row3.3    |
 | row4.1    | row4.2    | row4.3    |
 | row5.1    | row5.2    | row5.3    |
 '-----------+-----------+-----------'

=item * L</Text::Table::Manifold>

 +--------+--------+--------+
 |  col1  |  col2  |  col3  |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::ANSITable>

 .--------+--------+--------.
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 `--------+--------+--------'

=item * L</Text::ASCIITable>

 .--------------------------.
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 '--------+--------+--------'

=item * L</Text::FormatTable>

 col1  |col2  |col3  
 row1.1|row1.2|row1.3
 row2.1|row2.2|row2.3
 row3.1|row3.2|row3.3
 row4.1|row4.2|row4.3
 row5.1|row5.2|row5.3

=item * L</Text::MarkdownTable>

 | col1   | col2   | col3   |
 |--------|--------|--------|
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |

=item * L</Text::Table>

 col1   col2   col3  
 row1.1 row1.2 row1.3
 row2.1 row2.2 row2.3
 row3.1 row3.2 row3.3
 row4.1 row4.2 row4.3
 row5.1 row5.2 row5.3

=item * L</Text::Table::Tiny>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::Table::TinyBorderStyle>

 .--------+--------+--------.
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 `--------+--------+--------'

=item * L</Text::Table::More>

 .--------+--------+--------.
 | col1   | col2   | col3   |
 +========+========+========+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 `--------+--------+--------'

=item * L</Text::Table::Sprintf>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::Table::TinyColor>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::Table::TinyColorWide>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::Table::TinyWide>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=item * L</Text::Table::Org>

 | col1   | col2   | col3   |
 |--------+--------+--------|
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |

=item * L</Text::Table::CSV>

 "col1","col2","col3"
 "row1.1","row1.2","row1.3"
 "row2.1","row2.2","row2.3"
 "row3.1","row3.2","row3.3"
 "row4.1","row4.2","row4.3"
 "row5.1","row5.2","row5.3"

=item * L</Text::Table::HTML>

 <table>
 <thead>
 <tr><th>col1</th><th>col2</th><th>col3</th></tr>
 </thead>
 <tbody>
 <tr><td>row1.1</td><td>row1.2</td><td>row1.3</td></tr>
 <tr><td>row2.1</td><td>row2.2</td><td>row2.3</td></tr>
 <tr><td>row3.1</td><td>row3.2</td><td>row3.3</td></tr>
 <tr><td>row4.1</td><td>row4.2</td><td>row4.3</td></tr>
 <tr><td>row5.1</td><td>row5.2</td><td>row5.3</td></tr>
 </tbody>
 </table>

=item * L</Text::Table::HTML::DataTables>

 <html>
 <head>
 <link rel="stylesheet" type="text/css" href="file:///home/u1/perl5/perlbrew/perls/perl-5.34.0/lib/site_perl/5.34.0/auto/share/dist/Text-Table-HTML-DataTables/datatables-1.10.22/datatables.css">
 <script src="file:///home/u1/perl5/perlbrew/perls/perl-5.34.0/lib/site_perl/5.34.0/auto/share/dist/Text-Table-HTML-DataTables/jquery-2.2.4/jquery-2.2.4.min.js"></script>
 <script src="file:///home/u1/perl5/perlbrew/perls/perl-5.34.0/lib/site_perl/5.34.0/auto/share/dist/Text-Table-HTML-DataTables/datatables-1.10.22/datatables.js"></script>
 <script>var dt_opts = {"buttons":["colvis","print"],"dom":"lQfrtip"}; $(document).ready(function() { $("table").DataTable(dt_opts); $("select[name=DataTables_Table_0_length]").val(1000); $("select[name=DataTables_Table_0_length]").trigger("change"); });</script>
 
 </head>
 
 <body>
 <table>
 <thead>
 <tr><th>col1</th><th>col2</th><th>col3</th></tr>
 </thead>
 <tbody>
 <tr><td>row1.1</td><td>row1.2</td><td>row1.3</td></tr>
 <tr><td>row2.1</td><td>row2.2</td><td>row2.3</td></tr>
 <tr><td>row3.1</td><td>row3.2</td><td>row3.3</td></tr>
 <tr><td>row4.1</td><td>row4.2</td><td>row4.3</td></tr>
 <tr><td>row5.1</td><td>row5.2</td><td>row5.3</td></tr>
 </tbody>
 </table>
 </body>
 
 </html>

=item * L</Text::TabularDisplay>

 +--------+--------+--------+
 | col1   | col2   | col3   |
 +--------+--------+--------+
 | row1.1 | row1.2 | row1.3 |
 | row2.1 | row2.2 | row2.3 |
 | row3.1 | row3.2 | row3.3 |
 | row4.1 | row4.2 | row4.3 |
 | row5.1 | row5.2 | row5.3 |
 +--------+--------+--------+

=back

=head1 FAQ

=head2 What is an Acme::CPANModules::* module?

An Acme::CPANModules::* module, like this module, contains just a list of module
names that share a common characteristics. It is a way to categorize modules and
document CPAN. See L<Acme::CPANModules> for more details.

=head2 What are ways to use this Acme::CPANModules module?

Aside from reading this Acme::CPANModules module's POD documentation, you can
install all the listed modules (entries) using L<cpanm-cpanmodules> script (from
L<App::cpanm::cpanmodules> distribution):

 % cpanm-cpanmodules -n TextTable

Alternatively you can use the L<cpanmodules> CLI (from L<App::cpanmodules>
distribution):

    % cpanmodules ls-entries TextTable | cpanm -n

or L<Acme::CM::Get>:

    % perl -MAcme::CM::Get=TextTable -E'say $_->{module} for @{ $LIST->{entries} }' | cpanm -n

or directly:

    % perl -MAcme::CPANModules::TextTable -E'say $_->{module} for @{ $Acme::CPANModules::TextTable::LIST->{entries} }' | cpanm -n

This Acme::CPANModules module contains benchmark instructions. You can run a
benchmark for some/all the modules listed in this Acme::CPANModules module using
the L<bencher> CLI (from L<Bencher> distribution):

    % bencher --cpanmodules-module TextTable

This Acme::CPANModules module also helps L<lcpan> produce a more meaningful
result for C<lcpan related-mods> command when it comes to finding related
modules for the modules listed in this Acme::CPANModules module.
See L<App::lcpan::Cmd::related_mods> for more details on how "related modules"
are found.

=head1 HOMEPAGE

Please visit the project's homepage at L<https://metacpan.org/release/Acme-CPANModules-TextTable>.

=head1 SOURCE

Source repository is at L<https://github.com/perlancar/perl-Acme-CPANModules-TextTable>.

=head1 SEE ALSO

Related lists: L<Acme::CPANModules::HTMLTable>,
L<Acme::CPANModules::BrowsingTableInteractively>.

L<Acme::CPANModules> - about the Acme::CPANModules namespace

L<cpanmodules> - CLI tool to let you browse/view the lists

=head1 AUTHOR

perlancar <perlancar@cpan.org>

=head1 CONTRIBUTING


To contribute, you can send patches by email/via RT, or send pull requests on
GitHub.

Most of the time, you don't need to build the distribution yourself. You can
simply modify the code, then test via:

 % prove -l

If you want to build the distribution (e.g. to try to install it locally on your
system), you can install L<Dist::Zilla>,
L<Dist::Zilla::PluginBundle::Author::PERLANCAR>,
L<Pod::Weaver::PluginBundle::Author::PERLANCAR>, and sometimes one or two other
Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond
that are considered a bug and can be reported to me.

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2023, 2021, 2020, 2019 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Acme-CPANModules-TextTable>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=cut
