($sha512_of{$a} ||= sha512($a)
$sha512_of($a) 如果存在, 取其值(做下面的cmp);
如果不存在, 则取$a来计算sha512($a), 并且把值放到hash变量 $sha512_of{$a}中, 以下次可以使用.
因为在例子的算法中, @scripts里存的是单个字符, 所以重复的机会很大, 所以缓存起来会减少很大的计算量, 而在加密算法中这个计算又很费时.
如@script先放了一段拆分成单个字母的英文:
26 print "\@script length: ", scalar @script,"\n";
27
28
29 my $i;
30 my @sorted_scripts;
31 @sorted_scripts = sort { sha512($a) cmp sha512($b) } @script;
32 print "sha512() call acount: ",$i,"\n";
33
34 $i = 0;
35 @sorted_scripts = do {
36 my %sha512_of;
37 sort { ($sha512_of{$a} ||= sha512($a) )
38 cmp
39 ($sha512_of{$b} ||= sha512($b))
40 } @script;
41 };
42 print "sha512() call acount: ",$i,"\n";
43
44 sub sha512 {
45 $i++;
46 return shift;
47 }
[0:42@~] ./t
@script length: 1048
sha512() call acount: 16892
sha512() call acount: 44
[0:42@~]
附: 楼主应该读的是这本书吧:
在 2009-9-17,下午11:08, Michael Zeng 写道:
这脚本写的不太对吧和@sorted_scripts
=do {
sort { sha512($a) )
cmp
sha512($b) )
}
@scripts;}有什么区别 ?my %sha512_of; 是新定义的啊, 和没有一样
2009/9/17 钟声 <gh00920307@gmail.com>
@sorted_scripts
=do {
my %sha512_of;
sort { ($sha512_of{$a} ||= sha512($a) )
cmp
($sha512_of{$b} ||= sha512($b) )
}
@scripts;
}
书上说不要在sort中重新计算排序键。刚看到 ||= 这个符号我半天没反应过来
虽然搞懂是什么意思了,但总不像 += 和 --=那么容易接受。大家也都经常这样用吗?
--
Yours Sincerely
Zeng Hong
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论