返回列表 回复 发帖

一段精巧的闭包代码

来源:www.leohacks.com
    一段精巧的闭包代码。偶从PerlChina看到的。关于权限组的,估计对16你有很大的启发:)
偶正在研究中:)
代码来自于 MT blog 程序的 MT:ermission.pm 包
  1. {      
  2. my @Perms = (
  3. #### 定义权限,这是一个复合数组         
  4. [ 1, ';admin';, ';Administrator';, ],
  5. [ 2, ';post';, ';Post';, ],
  6. [ 4, ';upload';, ';Upload File';, ],
  7. [ 8, ';edit_all_posts';, ';Edit All Posts';, ],
  8. [ 16, ';edit_templates';, ';Edit Templates';, ],
  9. [ 32, ';edit_authors';, ';Edit Authors & Permissions';, ],
  10. [ 64, ';edit_config';, ';Configure Weblog';, ],
  11. [ 128, ';rebuild';, ';Rebuild Files';, ],
  12. [ 256, ';send_notifications';, ';Send Notifications';, ],
  13. [ 512, ';edit_categories';, ';Edit Categories';, ],
  14. [ 1024, ';edit_notifications';, ';Edit Address Book'; ],
  15. [ 2048, ';edit_blog_config';, ';Configure Weblog Preferences'; ],
  16. );
  17. sub set_full_permissions {
  18. ###  这是设置全权限,其实权限只是数字码,把上面数组中的数字全加,就是全权限了
  19. my $perms = shift;
  20. my $mask = 0;
  21. for my $ref (@Perms) {
  22. $mask += $ref->[0];
  23. }
  24. $perms->role_mask($mask);
  25. }
  26. sub set_permissions {
  27. ####  这个函数是我加的,呵呵,上面有两个权限也是我加的。
  28. my $perms = shift;
  29. my $mask = 2014;
  30. $perms->role_mask($mask);
  31. }
  32. sub perms { \@Perms }
  33. #### 这是返回数组引用
  34. ####################################### 闭包从最前面的 { 花括号开始的域中,到结束的 } 中
  35. ####################################### 这里是闭包的处理,自动生成函数
  36. no strict ';refs';;
  37. ####### 允许使用符号表
  38. for my $ref (@Perms) {
  39. ####### 对数组中的每一个,生成一个函数
  40. my $mask = $ref->[0];
  41. my $meth = ';can_'; . $ref->[1];
  42. #  这是函数名定义,如 admin 权限是 1, 这个函数就是 can_admin()
  43. *$meth = sub {
  44. #  这是符号表的匿名函数
  45. my $flags = $_[0]->role_mask || 0;
  46. #if (@_ == 2) {
  47. #    $flags = $_[1] ? ($flags | $mask) :
  48. #                    ($flags & ~$mask);
  49. #    $_[0]->role_mask($flags);
  50. #}
  51. $flags & $mask;
  52. };
  53. }
  54. }
  55. sub can_edit_entry {
  56. my $perms = shift;
  57. my($entry, $author) = @_;
  58. $perms->can_edit_all_posts ||      ($perms->can_post &&      $entry->author_id == $author->id);
  59. }
  60. 1;
复制代码

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表