# LOGO ⢀⣀⡤ ⢀⣤⣿⡗ ⣀⣀⣀ ⢀⣤⣤⣤⣄⡀ ⣠⡶⠿⠛⣹⡾⠛â¢â¡¼â Ÿâ¢›â ‰â ‰â ‰â£‰â££â£€â£€â£€â£€â£€â£€â£€â£€â£€â£€â¡„ ⢉⠻⣯⣉⡛⠒⠻⡷⢮⡙⠳⣤â¡â£¾â Ÿâ£€â£´â ‹â ⣀⡴⠋ ⣠⡟ â ⠚⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⢩⠛ ⠘⣧ ⠹⣿⡳⡀⠙⢦⡈⠳⠈⢱⡟ ⠋⣼⣿⣿⢿â ⠰⣶â â¢â¡†â¢ ⣠⣖⣢⠤⠶⠶⠂ ⡽⢃ ⣀ ⠈⢗⣲⠞⠓⠛⢦⡌⡿ ⡾⠃ ⣿⣿⡾ ⣿ ⣼⣠â ⢀⡾⣿⠟⣂⣠⡤⠤⠴⠶⠛⠛⠛⢋⡿ ⢀⡴⡲⠹â â â ⢶⡂⠈⣓⠱⣆⡼⠃ ⢰⣿⡟⢳ ⢀⣾⢇⡜⠋â ⣰⣯⠾⠷⠚⠉ ⢀⣴⠎ ⢸⡇ ⠘⠙⠳⠤⣕ ⠳⣄ ⠉⠓⢴⣱⣿⡅⣀⣤⠾⣟⣯⣤⣶⡶⢿⣿⣯⠆ ⢈⣽⠃⣀⣀⣠⣴⣾⣯⠄ ⣴⠇ ⢀⣹⣶⡀⢈⣷⣶⣤⣼⣿⡿⢗⡋⣩⣶⡟⣛⣿⣿⣷⣾⣛⣉⣀⡤⠾⠛⠒⠋⠉⠛⣿⡿⠋ ⢠⡠⠙⠛⣲⡶⣤⣤⣿⡿⠋â ⠻⠿⠛⠛⠙⠛⠛⠋⠉⠹⠿⠿⢿⣿â£â£ ⡖⣀⢀⣠⠤⢀⣈⣳⣄ ⢨⣶⣦⡤⣄⣀ â ‰â¢â£´â£‹â£¸â Ÿ ⣰⣶⠴⠒ ⠈⠛⠻⢿⣿⣿⡛⠋⠉⠙⣿ ⣠⡶⣫â£â ¶â£â¡€ ⢀⣴⠟⠉⢡â¡â¡¼ ⢠⡞ â ‰ ⢸⣿⡿⢿⡒⠒⠲⠿⠶⠶⠶⠟⠋â ⣀⣀⣀⠉⠳⣄ ⠲⣿⠷⠃⢀⣾⠷⠿⠦⢤⣤⡟ ⢀⣀⣤⣶⣯⣥⣤⣤⡞â ⠈⣼⣿⣷â£â¡³â ¤â£¤â£€â£€ â ‰ ⠙⠻⢦⣈⢳⡄ ⢀⡼⢋⣤⠴⠋â ⣴⠿⠿⢶⣶⣿⣿⠟⠛⢻⣿⣿⠟â ⠈⠻⣿â¡â ›â ·â£¦â£„⡀⠳⢤⡀ ⠙⠧⣄ ⣠⣿⠟⠉ ⣀⣀⡀ ⣤⣤⣼⣿⣿⣷⣂⣴⣿⡿⠋ ⠰⡆ ⢻⣿⣿⣶⣄⡈⠻⣠⠈⠙⠲⣤⣀⡀ ⠑⢦⣌⡙⠒ ⢰⡟â ⠛⢩⠶⠖⠛⣀â¡â ‰â ™â ¿â£¿â£¿â¡Ÿâ ‰ ⣷ ⣿⣿⣧⡙⢷⣄⡈⠂ ⠉⠉⠙⢷⡄⠈⠛⢦ ⣠⡿⠛⢶⣦⣤⣤⣴⣶ ⠈⡿⠟⠛⠉â ⢀⣀⣀ ⠉⠙⠛⠒⠂ â¡¿ ⣽⣿⠘⢻⣷⡀⠈⠉⠉ ⠹⣆ â ⡠⢸⣿⡿⠉⠙⠋ â ˆ â ˆâ ‰â£‰â … ⠓⠲⢤⣄⡀ ⣼⠃ ⢿⣿ ⣿⠇⢠⡀ â ⣄⣄ ⢹⡆ ⣷⡀ â¡¿ ⣀⠔ ⣠⣞â£â£€â£ ⣤⣤⣷⣌⠙⢦⡀⢀⡾⠃ ⢸⣿⡆⣻⠇ ⢹⣄ ⢹⡌⢳⣜⡟ ⢻⣧⣠⣸⡇ ⣠⡾⠟⠛⠉⣥⡾⢿⣿⣿⣿⣆ ⠙⠃ ⣿â¢â£¿â¡¿â¡€ ⠻⣷⢤⡀ ⢸⡇ ⢿⡇ ⠉⢻⢿⣿⣶⣤⣤⣀⣀⣀⣀⣤⣴⡿⠋â ⣠⡴⠟â¢â£´â£¿â£¿â£¿â£¿â£¿â¡† ⣼⡟⣼⣿⣷⢻⡜⣆ ⠘⢷⡙ ⣠⣤⡿ ⠈⠛â ⠘⠦⢿â£â ‰â ‰â ‰â ™â¢¿â ©â¢»â£¿â£¾â žâ ›â ⣾â ⠈⢻⣿⣿⣿⣿⡀⡀ ⢻⣰⠟â ⠘⢦⡻⣿⡆ ⢸⣷ ⣿⡟â ⠙⠋⠛⠳⣶⣶⠷⢾⣿⣿ ⢀⣿ ⢻⣿⣿⣿⡧ ⢀⣴⠋ â ⠈⢳ ⣸⠙⣦⢰⡟ ⠘⣿⣄⢼⣿⣿⣇⠒⢢⣿⣼⣧⡀ ⢤⡀⣿⣿⣿⡧ ⢀⣾⠃ ⢀⢠⡆ ⡞⢀⡴⣃⣸⡟⠳⣇ ⠹⡽⣾⣿⠹⣿⣆⣾⢯⣿⣿ â¡ž ⠻⣿⣿⣿â ⢠⣿⢠⡀ â¡Ÿ ⢀⣴⣿⠃â¢â¡¼â â ˆ ⠈⠛ ⢻⣿⣧⢸⢟⠶⢾⡇ ⣸⡿â ⢠⣾⡟⢼ ⣷ ⡇ ⣰⠋⠙â ⠈⣿⣻⣾⣦⣇⢸⣇⣀⣶⡿â ⣀⣀⣾⢿⡇⢸ ⣟⡦⣧⣶â unleashed ⠸⢿â¡â ›â »â ¿â ¿â ¿â ‹â£ ⡾⢋⣾â£â£¸â£·â¡¸â£‡â¢°â Ÿâ ›â »â¡„ v1.23 ⢻⡄ â ⠚⠋⣠⡾⣧⣿â ⠙⢳⣽⡟ ⠈⠳⢦⣤⣤⣀⣤⡶⠛ ⠈⢿⡆ ⢿⡇ â ˆ ⠈⠓ â ˆ # NAME e - beast mode unleashed # SYNOPSIS Add a trace marker: $ perl -Me -e 'sub f1 { trace } sub f2 { f1 } f2' Watch a reference for changes: $ perl -Me -e 'my $v = {}; sub f1 { watch( $v ) } sub f2 { f1; $v->{a} = 1 } f2' $ perl -Me -e ' package A { use e; my %h = ( aaa => 111 ); watch(\%h); sub f1 { $h{b} = 1; } sub f2 { f1(); delete $h{aaa}; } } A::f2(); ' Benchmark two snippets of code: $ perl -Me -e 'n { slow => sub{ ... }, fast => sub{ ... }}, 10000' Launch the Runtime::Debugger: $ perl -Me -e 'repl' Invoke the Tiny::Prof: $ perl -Me -e 'prof' Convert a data structure to json: $ perl -Me -e 'say j { a => [ 1..3] }' Convert a data structure to yaml: $ perl -Me -e 'say yml { a => [ 1..3] }' Pretty print a data structure: $ perl -Me -e 'p { a => [ 1..3] }' Data dump a data structure: $ perl -Me -e 'd { a => [ 1..3] }' Devel::Peek dump a data structure: $ perl -Me -e 'dd { a => [ 1..3] }' Print data as a table: $ perl -Me -e 'table( [qw(key value)], [qw(red 111)], [qw(blue 222)] )' +------+-------+ | key | value | +------+-------+ | red | 111 | | blue | 222 | +------+-------+ Encode/decode UTF-8: $ perl -Me -e 'printf "%#X\n", ord for split //, enc "\x{5D0}"' 0XD7 0X90 $ perl -C -Me -e 'say dec "\xD7\x90"' $ perl -Me -e 'utf8; say dec "\xD7\x90"' × # DESCRIPTION This module imports many features that make one-liners and script debugging much faster. It has been optimized for performance to not import all features right away: thereby making its startup cost quite low. # SUBROUTINES ## Investigation ### repl Add a breakpoint to code. Basically inserts a Read Evaluate Print Loop. Enable to analyze code in the process. CODE ... # Breakpoint repl CODE ... Simple debugger on the command line: $ perl -Me -e 'repl' ### trace Show a stack trace. trace( $depth=1 ) ### watch Watch a reference for changes. watch( $ref, OPTIONS ) OPTIONS: -clone => 0, # Will not watch cloned objects. -methods => "fetch", # Monitor just this method. -methods => [ "fetch" ], # Same. -levels => NUM, # How many scope levels to show. NUM, # Same. -raw => 1, # Include internal calls. -NUM, # Same. -message => STR, # Message to display. STR, # Same. ### prof Profile the code from this point on. my $obj = prof; ... # $obj goes out of scope and builds results. ### n Benchmark and compare different pieces of code. Time single block of code. n sub{ ... }; n sub{ ... }, 100000; # Compare blocks of code. n { slow => sub{ ... }, fast => sub{ ... }, }; n { slow => sub{ ... }, fast => sub{ ... }, }, 10000; ## Format Conversions ### j JSON Parser. my $bytes = j([1, 2, 3]); my $bytes = j({foo => 'bar'}); my $value = j($bytes); Encode Perl data structure or decode JSON with ["j" in Mojo::JSON](https://metacpan.org/pod/Mojo%3A%3AJSON#j). Convert Perl object to JSON string: $ perl -Me -e 'say j { a => [1..3]}' Convert JSON string to Perl object: $ perl -Me -e 'p j q({"a":[1,2,3]})' ### x XML parser. my $dom = x('<div>Hello!</div>'); Turn HTML/XML input into [Mojo::DOM](https://metacpan.org/pod/Mojo%3A%3ADOM) object. $ perl -Me -e 'say x("<div>hey</dev>")->at("div")->text' ### yml YAML parser. Convert Perl object to YAML string: $ perl -Me -e 'say yml { a => [1..3]}' Convert YAML string to Perl object: $ perl -Me -e 'p yml "---\na:\n- 1\n- 2\n- 3"' ### enc Encode UTF-8 code point to a byte stream: $ perl -C -Me -e 'printf "%#X\n", ord for enc("\x{5D0}") =~ /./g' 0XD7 0X90 ### dec Decode a byte steam to UTF-8 code point: $ perl -C -Me -e 'say dec "\xD7\x90"' × ### utf8 Set STDOUT and STDERR as UTF-8 encoded. ## Enhanced Types ### b Work with strings. my $stream = b('lalala'); Turn string into a [Mojo::ByteStream](https://metacpan.org/pod/Mojo%3A%3AByteStream) object. $ perl -Me -e 'b(g("mojolicious.org")->body)->html_unescape->say' ### c Work with arrays. my $collection = c(1, 2, 3); Turn list into a [Mojo::Collection](https://metacpan.org/pod/Mojo%3A%3ACollection) object. ## Files Convenience ### f Work with files. my $path = f('/home/sri/foo.txt'); Turn string into a [Mojo::File](https://metacpan.org/pod/Mojo%3A%3AFile) object. $ perl -Me -e 'say r j f("hello.json")->slurp' ## Output ### say Print with newline. $ perl -Me -e 'say 123' ### p Pretty data printer. $ perl -Me -e 'p [1..3]' ### np Return pretty printer data. $ perl -Me -e 'my $v = np [1..3]; say "got: $v"' ### d Data dumper. $ perl -Me -e 'd [1..3]' ### dd Internal data dumper. $ perl -Me -e 'dd [1..3]' ### dye Color a string. $ perl -Me -e 'say dye 123, "RED"' ### table Print data as a table: $ perl -Me -e 'table( [qw(key value)], [qw(red 111)], [qw(blue 222)] )' +------+-------+ | key | value | +------+-------+ | red | 111 | | blue | 222 | +------+-------+ Context sensitive! - Void - output table. - List - return individual lines. - Scalar - return entire table as a string. ## Web Related ### g my $res = g('example.com'); my $res = g('http://example.com' => {Accept => '*/*'} => 'Hi!'); my $res = g('http://example.com' => {Accept => '*/*'} => form => {a => 'b'}); my $res = g('http://example.com' => {Accept => '*/*'} => json => {a => 'b'}); Perform `GET` request with ["get" in Mojo::UserAgent](https://metacpan.org/pod/Mojo%3A%3AUserAgent#get) and return resulting [Mojo::Message::Response](https://metacpan.org/pod/Mojo%3A%3AMessage%3A%3AResponse) object. $ perl -Me -e 'say g("mojolicious.org")->dom("h1")->map("text")->join("\n")' ### l Work with URLs. my $url = l('https://mojolicious.org'); Turn a string into a [Mojo::URL](https://metacpan.org/pod/Mojo%3A%3AURL) object. $ perl -Me -e 'say l("/perldoc")->to_abs(l("https://mojolicious.org"))' ## Package Tools ### monkey\_patch Insert subroutines into the symbol table. Extracted from Mojo::Util for performance. Import methods into another function (as done this module): $ perl -e 'package A; use e; sub import { my $c = caller(); monkey_patch $c, new => sub { say "Im new" } } package main; A->import; new()' Im new Import methods into the same package (probably not so useful): $ perl -e 'package A; use e; sub import { my $c = caller(); monkey_patch $c, new => sub { say "Im new" } } A->import; A->new()' Im new Perhaps can be updated based on the outcome of this issue: [https://github.com/mojolicious/mojo/pull/2173](https://github.com/mojolicious/mojo/pull/2173) ### pod Work with perl pod. ### import # AUTHOR Tim Potapov, `<tim.potapov[AT]gmail.com>` # BUGS Please report any bugs or feature requests to [https://github.com/poti1/e/issues](https://github.com/poti1/e/issues). # SUPPORT You can find documentation for this module with the perldoc command. perldoc e You can also look for information at: [https://metacpan.org/pod/e](https://metacpan.org/pod/e) [https://github.com/poti1/e](https://github.com/poti1/e) Logo was generated using: [https://emojicombos.com/dot-art-editor](https://emojicombos.com/dot-art-editor) # LICENSE AND COPYRIGHT This software is Copyright (c) 2024 by Tim Potapov. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible)