在爲CPAN模塊DateTime的文檔,我發現以下幾點:什麼是Perl中的「字符串化」?
一旦您設置格式,在 重載字符串化方法 使用格式化。
似乎有一些叫做「串化」的Perl概念,我不知怎的錯過了。谷歌搜索沒有太多澄清。這是什麼「串化」?
在爲CPAN模塊DateTime的文檔,我發現以下幾點:什麼是Perl中的「字符串化」?
一旦您設置格式,在 重載字符串化方法 使用格式化。
似乎有一些叫做「串化」的Perl概念,我不知怎的錯過了。谷歌搜索沒有太多澄清。這是什麼「串化」?
任何時候perl需要將值轉換爲字符串時都會發生「字符串化」。這可以打印出來,連接到另一個字符串,應用正則表達式,或者在Perl中使用任何其他字符串操作函數。
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編譯指示完成的。下面是一個對象的例子是字符串化時,其產生的總和:
{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'
還有其他幾個ifications是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;`
當在需要字符串的上下文中使用對象時,會調用字符串化方法。該方法描述瞭如何將對象表示爲字符串。例如,如果你說那麼因爲print期望一個字符串,所以它實際上傳遞了stringify方法的結果來打印。
所以這就像調用一個'object.toString()'方法? – 2011-03-07 00:34:35
是的,但只要需要字符串就會隱式調用它。 – ikegami 2011-03-07 23:41:37
只需加入上面的答案,就可以用java比喻...
與Java中的Object.toString()非常相似。默認情況下是全方位的,但在需要時可能會被覆蓋。
+1,但你應該使用'sub new {bless [@_ [1 .. $#_]],$ _ [0]}'。 – 2011-03-07 01:19:44
@Chris =>謝謝,現在更新,拼出來 – 2011-03-07 01:26:15
@Eric - 夠公平的。我希望堅持使用'add'的風格,但我更喜歡現在通用的方式。 – 2011-03-07 01:34:25