Mojo::Util(3) Portable utility functions

SYNOPSIS


use Mojo::Util qw(b64_encode url_escape url_unescape);
my $str = 'test=23';
my $escaped = url_escape $str;
say url_unescape $escaped;
say b64_encode $escaped, '';

DESCRIPTION

Mojo::Util provides portable utility functions for Mojo.

FUNCTIONS

Mojo::Util implements the following functions, which can be imported individually.

b64_decode

  my $bytes = b64_decode $b64;

Base64 decode bytes.

b64_encode

  my $b64 = b64_encode $bytes;
  my $b64 = b64_encode $bytes, "\n";

Base64 encode bytes, the line ending defaults to a newline.

camelize

  my $camelcase = camelize $snakecase;

Convert "snake_case" string to "CamelCase" and replace "-" with "::".

  # "FooBar"
  camelize 'foo_bar';
  # "FooBar::Baz"
  camelize 'foo_bar-baz';
  # "FooBar::Baz"
  camelize 'FooBar::Baz';

class_to_file

  my $file = class_to_file 'Foo::Bar';

Convert a class name to a file.

  # "foo_bar"
  class_to_file 'Foo::Bar';
  # "foobar"
  class_to_file 'FOO::Bar';
  # "foo_bar"
  class_to_file 'FooBar';
  # "foobar"
  class_to_file 'FOOBar';

class_to_path

  my $path = class_to_path 'Foo::Bar';

Convert class name to path.

  # "Foo/Bar.pm"
  class_to_path 'Foo::Bar';
  # "FooBar.pm"
  class_to_path 'FooBar';

decamelize

  my $snakecase = decamelize $camelcase;

Convert "CamelCase" string to "snake_case" and replace "::" with "-".

  # "foo_bar"
  decamelize 'FooBar';
  # "foo_bar-baz"
  decamelize 'FooBar::Baz';
  # "foo_bar-baz"
  decamelize 'foo_bar-baz';

decode

  my $chars = decode 'UTF-8', $bytes;

Decode bytes to characters, or return "undef" if decoding failed.

deprecated

  deprecated 'foo is DEPRECATED in favor of bar';

Warn about deprecated feature from perspective of caller. You can also set the "MOJO_FATAL_DEPRECATIONS" environment variable to make them die instead.

dumper

  my $perl = dumper {some => 'data'};

Dump a Perl data structure with Data::Dumper.

encode

  my $bytes = encode 'UTF-8', $chars;

Encode characters to bytes.

files

  my @files = files '/tmp/uploads';
  my @files = files '/tmp/uploads', {hidden => 1};

List all files recursively in a directory.

  # List all templates
  say for files '/home/sri/myapp/templates';

These options are currently available:

hidden
  hidden => 1

Include hidden files and directories.

hmac_sha1_sum

  my $checksum = hmac_sha1_sum $bytes, 'passw0rd';

Generate HMAC-SHA1 checksum for bytes.

  # "11cedfd5ec11adc0ec234466d8a0f2a83736aa68"
  hmac_sha1_sum 'foo', 'passw0rd';

html_unescape

  my $str = html_unescape $escaped;

Unescape all HTML entities in string.

  # "<div>"
  html_unescape '&lt;div&gt;';

md5_bytes

  my $checksum = md5_bytes $bytes;

Generate binary MD5 checksum for bytes.

md5_sum

  my $checksum = md5_sum $bytes;

Generate MD5 checksum for bytes.

  # "acbd18db4cc2f85cedef654fccc4a4d8"
  md5_sum 'foo';

monkey_patch

  monkey_patch $package, foo => sub {...};
  monkey_patch $package, foo => sub {...}, bar => sub {...};

Monkey patch functions into package.

  monkey_patch 'MyApp',
    one   => sub { say 'One!' },
    two   => sub { say 'Two!' },
    three => sub { say 'Three!' };

punycode_decode

  my $str = punycode_decode $punycode;

Punycode decode string as described in RFC 3492 <http://tools.ietf.org/html/rfc3492>.

  # "bücher"
  punycode_decode 'bcher-kva';

punycode_encode

  my $punycode = punycode_encode $str;

Punycode encode string as described in RFC 3492 <http://tools.ietf.org/html/rfc3492>.

  # "bcher-kva"
  punycode_encode 'bücher';

quote

  my $quoted = quote $str;

Quote string.

secure_compare

  my $bool = secure_compare $str1, $str2;

Constant time comparison algorithm to prevent timing attacks.

sha1_bytes

  my $checksum = sha1_bytes $bytes;

Generate binary SHA1 checksum for bytes.

sha1_sum

  my $checksum = sha1_sum $bytes;

Generate SHA1 checksum for bytes.

  # "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
  sha1_sum 'foo';

slurp

  my $bytes = slurp '/etc/passwd';

Read all data at once from file.

split_cookie_header

  my $tree = split_cookie_header 'a=b; expires=Thu, 07 Aug 2008 07:07:59 GMT';

Same as ``split_header'', but handles "expires" values from RFC 6265 <http://tools.ietf.org/html/rfc6265>.

split_header

   my $tree = split_header 'foo="bar baz"; test=123, yada';

Split HTTP header value into key/value pairs, each comma separated part gets its own array reference, and keys without a value get "undef" assigned.

  # "one"
  split_header('one; two="three four", five=six')->[0][0];
  # "two"
  split_header('one; two="three four", five=six')->[0][2];
  # "three four"
  split_header('one; two="three four", five=six')->[0][3];
  # "five"
  split_header('one; two="three four", five=six')->[1][0];
  # "six"
  split_header('one; two="three four", five=six')->[1][1];

spurt

  $bytes = spurt $bytes, '/etc/passwd';

Write all data at once to file.

squish

  my $squished = squish $str;

Trim whitespace characters from both ends of string and then change all consecutive groups of whitespace into one space each.

  # "foo bar"
  squish '  foo  bar  ';

steady_time

  my $time = steady_time;

High resolution time elapsed from an arbitrary fixed point in the past, resilient to time jumps if a monotonic clock is available through Time::HiRes.

tablify

  my $table = tablify [['foo', 'bar'], ['baz', 'yada']];

Row-oriented generator for text tables.

  # "foo   bar\nyada  yada\nbaz   yada\n"
  tablify [['foo', 'bar'], ['yada', 'yada'], ['baz', 'yada']];

term_escape

  my $escaped = term_escape $str;

Escape all POSIX control characters except for "\n".

  # "foo\\x09bar\\x0d\n"
  term_escape "foo\tbar\r\n";

trim

  my $trimmed = trim $str;

Trim whitespace characters from both ends of string.

  # "foo bar"
  trim '  foo bar  ';

unindent

  my $unindented = unindent $str;

Unindent multi-line string.

  # "foo\nbar\nbaz\n"
  unindent "  foo\n  bar\n  baz\n";

unquote

  my $str = unquote $quoted;

Unquote string.

url_escape

  my $escaped = url_escape $str;
  my $escaped = url_escape $str, '^A-Za-z0-9\-._~';

Percent encode unsafe characters in string as described in RFC 3986 <http://tools.ietf.org/html/rfc3986>, the pattern used defaults to "^A-Za-z0-9\-._~".

  # "foo%3Bbar"
  url_escape 'foo;bar';

url_unescape

  my $str = url_unescape $escaped;

Decode percent encoded characters in string as described in RFC 3986 <http://tools.ietf.org/html/rfc3986>.

  # "foo;bar"
  url_unescape 'foo%3Bbar';

xml_escape

  my $escaped = xml_escape $str;

Escape unsafe characters "&", "<", ">", """ and "'" in string, but do not escape Mojo::ByteStream objects.

  # "&lt;div&gt;"
  xml_escape '<div>';
  # "<div>"
  use Mojo::ByteStream 'b';
  xml_escape b('<div>');

xor_encode

  my $encoded = xor_encode $str, $key;

XOR encode string with variable length key.