标题:
一段精巧的闭包代码
[打印本页]
作者:
cnangel
时间:
2005-8-24 12:35
标题:
一段精巧的闭包代码
来源:www.leohacks.com
一段精巧的闭包代码。偶从PerlChina看到的。关于权限组的,估计对16你有很大的启发:)
偶正在研究中:)
代码来自于 MT blog 程序的 MT:
ermission.pm 包
{
my @Perms = (
#### 定义权限,这是一个复合数组
[ 1, ';admin';, ';Administrator';, ],
[ 2, ';post';, ';Post';, ],
[ 4, ';upload';, ';Upload File';, ],
[ 8, ';edit_all_posts';, ';Edit All Posts';, ],
[ 16, ';edit_templates';, ';Edit Templates';, ],
[ 32, ';edit_authors';, ';Edit Authors & Permissions';, ],
[ 64, ';edit_config';, ';Configure Weblog';, ],
[ 128, ';rebuild';, ';Rebuild Files';, ],
[ 256, ';send_notifications';, ';Send Notifications';, ],
[ 512, ';edit_categories';, ';Edit Categories';, ],
[ 1024, ';edit_notifications';, ';Edit Address Book'; ],
[ 2048, ';edit_blog_config';, ';Configure Weblog Preferences'; ],
);
sub set_full_permissions {
### 这是设置全权限,其实权限只是数字码,把上面数组中的数字全加,就是全权限了
my $perms = shift;
my $mask = 0;
for my $ref (@Perms) {
$mask += $ref->[0];
}
$perms->role_mask($mask);
}
sub set_permissions {
#### 这个函数是我加的,呵呵,上面有两个权限也是我加的。
my $perms = shift;
my $mask = 2014;
$perms->role_mask($mask);
}
sub perms { \@Perms }
#### 这是返回数组引用
####################################### 闭包从最前面的 { 花括号开始的域中,到结束的 } 中
####################################### 这里是闭包的处理,自动生成函数
no strict ';refs';;
####### 允许使用符号表
for my $ref (@Perms) {
####### 对数组中的每一个,生成一个函数
my $mask = $ref->[0];
my $meth = ';can_'; . $ref->[1];
# 这是函数名定义,如 admin 权限是 1, 这个函数就是 can_admin()
*$meth = sub {
# 这是符号表的匿名函数
my $flags = $_[0]->role_mask || 0;
#if (@_ == 2) {
# $flags = $_[1] ? ($flags | $mask) :
# ($flags & ~$mask);
# $_[0]->role_mask($flags);
#}
$flags & $mask;
};
}
}
sub can_edit_entry {
my $perms = shift;
my($entry, $author) = @_;
$perms->can_edit_all_posts || ($perms->can_post && $entry->author_id == $author->id);
}
1;
复制代码
欢迎光临 星星博客 (http://bbs.huhoo.net/)
Powered by Discuz! 7.0.0