#!/usr/bin/env perl use v5.38; use autodie; use constant { SEP1 => "\n" . '=' x 40, SEP2 => '-' x 40, }; use Benchmark 'cmpthese'; my ($null_fh, $base_str); BEGIN { open $null_fh, '>', '/dev/null'; $base_str = <<~'EOT'; AdataA BdataB CdataC EOT } say 'Test', SEP1; net1(); say SEP2; net2(); say SEP2; hau1(); say SEP2; ner1(); say SEP2; ner2(); say SEP2; kco1(); say SEP2; kco2(); say SEP2; my $bench_mult = 1_000; say 'Bench', SEP1; cmpthese 0 => { net1 => sub { net1($bench_mult, $null_fh); }, net2 => sub { net2($bench_mult, $null_fh); }, hau1 => sub { hau1($bench_mult, $null_fh); }, ner1 => sub { ner1($bench_mult, $null_fh); }, ner2 => sub { ner2($bench_mult, $null_fh); }, kco1 => sub { kco1($bench_mult, $null_fh); }, kco2 => sub { kco2($bench_mult, $null_fh); }, }; say SEP2; sub net1 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; while ($str =~ /(^A|^B)(.+)$/mg){ $out_fh->say("$1 net1 $2"); } return; } sub net2 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; open my $fh, '<', \$str; while (<$fh>) { my ($name, $data) = m/(^A|^B)(.+)$/ or next; $out_fh->say("$name net2 $data"); } return; } sub hau1 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; while ($str =~ m{^ (?A|B) (?.+) $}xmg) { $out_fh->say("$+{name} hau1 $+{data}"); } return; } sub ner1 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; $out_fh->say("$1 ner1 $2") while $str =~ /^([AB])(.+)$/mg; return; } sub ner2 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; $str =~ /^([AB])(.++)$(?{ $out_fh->say("$1 ner2 $2") })./m; return; } sub kco1 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; state $re = qr{(?m:^([AB])(.+)$)}; $out_fh->say("$1 kco1 $2") while $str =~ /$re/g; return; } sub kco2 ($mult = 1, $out_fh = *STDOUT) { state $str = $base_str x $mult; state $re = qr{(?m:^([AB])(.+)$)}; $out_fh->say("$1 kco2 $2") while $str =~ /$re/go; return; }