在CPAN模块DateTime的文档中,我发现了以下内容:
设置格式化程序后,重载的字符串化方法将使用格式化程序.
似乎有一些叫做"字符串化"的Perl概念我不知何故错过了.谷歌搜索没有说清楚.什么是"字符串化"?
Eri*_*rom 50
每当perl需要将值转换为字符串时,就会发生"字符串化".这可能是打印它,将它与另一个字符串连接起来,对它应用正则表达式,或者在Perl中使用任何其他字符串操作函数.
say $obj;
say "object is: $obj";
if ($obj =~ /xyz/) {...}
say join ', ' => $obj, $obj2, $obj3;
if (length $obj > 10) {...}
$hash{$obj}++;
...
Run Code Online (Sandbox Code Playgroud)
通常,对象将字符串Some::Package=HASH(0x467fbc)
化为类似于perl正在打印它所包含的包的内容,以及引用的类型和地址.
某些模块选择覆盖此行为.在Perl中,这是通过重载编译指示完成的.下面是一个对象的示例,当字符串化生成其总和时:
{package Sum;
use List::Util ();
sub new {my $class = shift; bless [@_] => $class}
use overload fallback => 1,
'""' => sub {List::Util::sum @{$_[0]}};
sub add {push @{$_[0]}, @_[1 .. $#_]}
}
my $sum = Sum->new(1 .. 10);
say ref $sum; # prints 'Sum'
say $sum; # prints '55'
$sum->add(100, 1000);
say $sum; # prints '1155'
Run Code Online (Sandbox Code Playgroud)
还有其他几个overload
可以让您定义:
'bool' Boolification The value in boolean context `if ($obj) {...}`
'""' Stringification The value in string context `say $obj; length $obj`
'0+' Numification The value in numeric context `say $obj + 1;`
'qr' Regexification The value when used as a regex `if ($str =~ /$obj/)`
Run Code Online (Sandbox Code Playgroud)
对象甚至可以表现为不同的类型:
'${}' Scalarification The value as a scalar ref `say $$obj`
'@{}' Arrayification The value as an array ref `say for @$obj;`
'%{}' Hashification The value as a hash ref `say for keys %$obj;`
'&{}' Codeification The value as a code ref `say $obj->(1, 2, 3);`
'*{}' Globification The value as a glob ref `say *$obj;`
Run Code Online (Sandbox Code Playgroud)
在期望字符串的上下文中使用对象时,将调用字符串化方法.该方法描述了如何将对象表示为字符串.因此,例如,如果你说print object;
因为print期望一个字符串,它实际上是将stringify方法的结果传递给print.