Mojo::Util为Mojo框架提供了便携实用的工具函数。
b64_decode
my $bytes = b64_decode $b64;
## ab仵士杰
$bytes = b64_decode("YWLku7Xlo6vmnbA=");
提供Base64解码功能。
b64_encode
my $b64 = b64_encode $bytes;
my $b64 = b64_encode $bytes, "\n";
## YWLku7Xlo6vmnbA=
$bytes = b64_encode("ab仵士杰");
提供Base64编码功能,默认分隔符为换行符。
camelize
my $camelcase = camelize $snakecase;
把 snake_case 格式的字符串转换为 CamelCase 格式并用 ::
替换-
。
# "FooBar"
camelize 'foo_bar';
# "FooBar::Baz"
camelize 'foo_bar-baz';
# "FooBar::Baz"
camelize 'FooBar::Baz';
decamelize
my $snakecase = decamelize $camelcase;
此方法是 camelize 的逆方法,它把CamelCase格式的字符串转换为snake_case格式,并用-
替换::
。
# "foo_bar"
decamelize 'FooBar';
# "foo_bar-baz"
decamelize 'FooBar::Baz';
# "foo_bar-baz"
decamelize 'foo_bar-baz';
class_to_file
my $file = class_to_file 'Foo::Bar';
将类名转换为文件,实现代码如下:
sub class_to_file {
my $class = shift;
$class =~ s/::|'//g;
$class =~ s/([A-Z])([A-Z]*)/$1 . lc $2/ge;
return decamelize($class);
}
示例如下:
# "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';
把类名转换为路径,配合%INC完成类名到文件路径的转换。
# "Foo/Bar.pm"
class_to_path 'Foo::Bar';
# "FooBar.pm"
class_to_path 'FooBar';
encode
my $bytes = encode 'UTF-8', $chars;
字符编码,与Encode 中的 encode 函数工作原理相同。
decode
my $chars = decode 'UTF-8', $bytes;
对字符串进行解码,如果解码失败则返回undef。与Encode包中的decode函数工作原理相同。
deprecated
deprecated 'foo is DEPRECATED in favor of bar';
警告调用者这是一个已弃用的功能。您还可以设置MOJO_FATAL_DEPRECATIONS环境变量,这样调用这个函数就不仅仅是警告,而是会执行出错,并退出程序。
dumper
my $perl = dumper {some => 'data'};
使用 Data::Dumper 转储Perl的数据结构。
extract_usage
my $usage = extract_usage;
my $usage = extract_usage '/home/sri/foo.pod';
从包含POD的文件中提取SYNOPSIS段的信息,默认是从调用这个方法的文件中提取。
# "Usage: APPLICATION test [OPTIONS]\n"
extract_usage;
=head1 SYNOPSIS
Usage: APPLICATION test [OPTIONS]
=cut
getopt
getopt
'H|headers=s' => \my @headers,
't|timeout=i' => \my $timeout,
'v|verbose' => \my $verbose;
getopt $array,
'H|headers=s' => \my @headers,
't|timeout=i' => \my $timeout,
'v|verbose' => \my $verbose;
getopt $array, ['pass_through'],
'H|headers=s' => \my @headers,
't|timeout=i' => \my $timeout,
'v|verbose' => \my $verbose;
使用Getopt :: Long从数组引用中提取选项,但不更改其全局配置,默认为使用@ARGV。配置选项no_auto_abbrev,no_ignore_case默认情况下被启用。
# Extract "charset" option
getopt ['--charset', 'UTF-8'], 'charset=s' => \my $charset;
say $charset;
hmac_sha1_sum
my $checksum = hmac_sha1_sum $bytes, 'passw0rd';
为字节生成HMAC-SHA1校验和。
# "11cedfd5ec11adc0ec234466d8a0f2a83736aa68"
hmac_sha1_sum 'foo', 'passw0rd';
html_attr_unescape
my $str = html_attr_unescape $escaped;
与 html_unescape 方法相同,但这里的方法 html_attr_unescape 是专门用于处理html属性的。
# "foo=bar<est=baz"
html_attr_unescape 'foo=bar<est=baz';
# "foo=bar<est=baz"
html_attr_unescape 'foo=bar<est=baz';
html_unescape
my $str = html_unescape $escaped;
翻译字符串中的所有HTML实体。
# "<div>"
html_unescape '<div>';
md5_bytes
my $checksum = md5_bytes $bytes;
为字节数据生成二进制的MD5校验和。
md5_sum
my $checksum = md5_sum $bytes;
为字节数据生成十六进制编码后字符串形式的MD5检验和。
# "acbd18db4cc2f85cedef654fccc4a4d8"
md5_sum 'foo';
monkey_patch
monkey_patch $package, foo => sub {...};
monkey_patch $package, foo => sub {...}, bar => sub {...};
功能包装器,可以动态的为一个“包”添加新函数。是一个打补丁的工具。
monkey_patch 'MyApp',
one => sub { say 'One!' },
two => sub { say 'Two!' },
three => sub { say 'Three!' };
punycode_decode
my $str = punycode_decode $punycode;
Punycode解码字符串,如RFC 3492所述。
# "bücher"
punycode_decode 'bcher-kva';
punycode_encode
my $punycode = punycode_encode $str;
Punycode编码字符串,如RFC 3492所述。
# "bcher-kva"
punycode_encode 'bücher';
quote
my $quoted = quote $str;
包装字符串,并对字符串中的特殊字符进行转义。
unquote
my $str = unquote $quoted;
quote 函数的逆操作。
secure_compare
my $bool = secure_compare $str1, $str2;
恒定时间比较算法,防止定时攻击。
sha1_bytes
my $checksum = sha1_bytes $bytes;
为字节数据生成二进制SHA1校验和。
sha1_sum
my $checksum = sha1_sum $bytes;
为字节数据生成十六进制编码的字符串形式的SHA1校验和。
# "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
sha1_sum 'foo';
slugify
my $slug = slugify $string;
my $slug = slugify $string, $bool;
返回从输入字符串生成的URL段。删除非URL单词的字符,字符串被修剪和缩小,空格字符被短划线替换。默认情况下,非ASCII字符被标准化为ASCII字符替换或删除,但如果作为第二个参数传递真值,则所有字符都将根据unicode语义被允许在结果中。
# "joel-is-a-slug"
slugify 'Joel is a slug';
# "this-is-my-resume"
slugify 'This is: my - résumé! ☃ ';
# "this-is-my-résumé"
slugify 'This is: my - résumé! ☃ ', 1;
split_cookie_header
my $tree = split_cookie_header 'a=b; expires=Thu, 07 Aug 2008 07:07:59 GMT';
与split_header基本相同,唯一不同的是使用RFC 6265的中的规定处理expires的值。
split_header
my $tree = split_header 'foo="bar baz"; test=123, yada';
将HTTP标头值分解为键/值对,每个逗号分隔的部分都会被转换为数组引用,如果key没有value相对应,则会给其赋值为undef。
# "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];
steady_time(不理解)
my $time = steady_time;
从过去任意一个固定点开始的高分辨率时间,如果通过Time :: HiRes可以获得单调时钟,则时间跳转有弹性。
tablify
my $table = tablify [['foo', 'bar'], ['baz', 'yada']];
用于文本形式表格的行生成器。
# "foo bar\nyada yada\nbaz yada\n"
tablify [['foo', 'bar'], ['yada', 'yada'], ['baz', 'yada']];
term_escape
my $escaped = term_escape $str;
对除换行符(\n)之外的所有POSIX控制字符进行转义。
trim
my $trimmed = trim $str;
去除字符串两端的空格字符。
# "foo bar"
trim ' foo bar ';
unindent
my $unindented = unindent $str;
对多行文本进行修剪,对每行文本起始位置删除固定长度的空白。
# "foo\nbar\nbaz\n"
unindent " foo\n bar\n baz\n";
url_escape
my $escaped = url_escape $str;
my $escaped = url_escape $str, '^A-Za-z0-9\-._~';
根据要求用百分号编码字符串中所有不安全的字符,如RFC 3986中所述。所有使用的默认模式为:^A-Za-z0-9\-._~
# "foo%3Bbar"
url_escape 'foo;bar';
url_unescape
my $str = url_unescape $escaped;
此函数为 url_escape 的逆操作。
# "foo;bar"
url_unescape 'foo%3Bbar';
xml_escape
my $escaped = xml_escape $str;
过滤xml格式的字符串中所有不安全的字符 ,包括&
, <
, >
, "
和'
,如果字符以Mojo::ByteStream对象的形式出现,则不进行过滤。
# "<div>"
xml_escape '<div>';
# "<div>"
use [Mojo::ByteStream](https://metacpan.org/pod/Mojo::ByteStream) 'b';
xml_escape b( '<div>');
xor_encode
my $encoded = xor_encode $str, $key;
用XOR算法编码具有可变长度的字符串。
_stash
这个方法没有导出,想要使用必须使用完全限定名。
- 这个方法在接收两个参数时,第一个参数被当成属性名$attrName,第二个参数作为对象$obj。返回对象对应属性的值$obj->{$attrName}。
- 这个方法在接收三个参数并且第三个参数不为引用的情意下,前两个参数的含义不变与(1)中相同,第三个参数会作为$key。对象对应属性值$obj->{$attrName}会被当成一个HASHREF类型的数据,返回其键名为$key的$value值。也就是返回$obj->{$attrName}->{$key}的值。
- 当参数多于三个或第三个参数为引用时,前两个参数的含义不变与(1)中相同。如果第三个参数为引用,则会被当成hashref类型;如果参数多于三个,则后面的参数必定为偶数个,并且把后面的参数放到一起作为一个hash处理。然后把这个hash或hashref中的内容合并到$obj->{$attrName}中,如果$obj->{$attrName}中已经存在了某些键,则会被新的值覆盖。最后返回$obj。
方法的实现代码如下:
sub _stash {
my ($name, $object) = (shift, shift);
# Hash
return $object->{$name} ||= {} unless @_;
# Get
return $object->{$name}{$_[0]} unless @_ > 1 || ref $_[0];
# Set
my $values = ref $_[0] ? $_[0] : {@_};
@{$object->{$name}}{keys %$values} = values %$values;
return $object;
}