在CPAN模块DateTime的文档中,我发现了以下内容:
设置格式化程序后,即可 重载的字符串化方法会 使用格式化程序。
似乎有一些叫做“字符串化”的Perl概念我不知何故错过了。谷歌搜索没有说清楚。什么是“字符串化”?
答案 0 :(得分:50)
say $obj;
say "object is: $obj";
if ($obj =~ /xyz/) {...}
say join ', ' => $obj, $obj2, $obj3;
if (length $obj > 10) {...}
$hash{$obj}++;
...
通常,对象将字符串化为类似Some::Package=HASH(0x467fbc)
的内容,其中perl正在打印它所包含的包,以及引用的类型和地址。
某些模块选择覆盖此行为。在Perl中,这是使用overload pragma完成的。下面是一个对象的示例,当字符串化生成其总和时:
{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'
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/)`
对象甚至可以表现为不同的类型:
'${}' 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;`
答案 1 :(得分:7)
在期望字符串的上下文中使用对象时,将调用字符串化方法。该方法描述了如何将对象表示为字符串。因此,例如,如果你说print object;
那么因为print期望一个字符串,它实际上是将stringify方法的结果传递给print。
答案 2 :(得分:1)
只是添加上面的答案,用java来比喻......
与Java中的Object.toString()非常相似。 Omni-present默认存在但在需要时可能会被覆盖。