App-pl
view release on metacpan or search on metacpan
echo &Form;
}
# Form without newline
sub Form($@) {
(my $form = shift) =~ s/%\K(%|[^a-z]+)/ my $x = $1; $x =~ tr!:!$!; $x /eg; # also matches %%, todo /r
Echo sprintf $form, &Echo;
}
sub benchmark(&@) {
my( $code, $name, @args ) = @_;
local( $a, $b ) = ($a, $b);
$name //= 'anonymous';
require Benchmark;
local $SIG{__WARN__} = sub { die @_ };
if( @args ) {
say Benchmark::timestr( Benchmark::countit( 10, $code )), " $name: $_"
for @args;
} else {
say Benchmark::timestr( Benchmark::countit( 10, $code )), " $name";
}
}
# Do it 100x for very fast test code (to increase weight compared to Benchmark overhead).
sub Benchmark(&@) {
my( $code, @rest ) = @_;
benchmark { for my $i (0..99) { &$code() }} @rest;
}
sub Config(@) {
require Config;
if( @_ ) {
#{map { pairgrep { $a =~ /$_/ } %Config::Config } @_}; # needs 5.20
my %config;
while( my( $k, $v ) = each %Config::Config ) {
}
}
# trim small values from %NUMBER
sub Number(;$) {
my $n = $_[0] // 2;
$NUMBER{$_} < $n and delete $NUMBER{$_} for keys %NUMBER;
}
# Pipe command to CODE
sub piped(&$@) {
my $code = shift;
open my $fd, "-|", @_ or die "$_[0]: $!\n";
&$code() while <$fd>;
}
sub help(;$) {
if( @_ && ! defined $_[0] ) {
print <<\EOF;
usage: pl {-{BbeE} program} [-o] [-Vversion] [-perlopt...] [--] [main program] [arg ...]
-Aprog map prog over @A (or undef) returning new @A
}
# run pl, expect shift
sub pl_e($@) {
at;
local $_ = shift;
&pl;
}
# run pl, expect $_ altered by shift->()
sub pl_a(&@) {
at;
local $_ = $_;
shift->();
&pl;
}
1;
( run in 0.980 second using v1.01-cache-2.11-cpan-49f99fa48dc )