Moose强制转换为文件权限八进制值

时间:2015-06-15 17:17:25

标签: perl moose

在我的Moose对象中需要管理file-permission属性。很高兴接受任何变体,例如:

AddWithValue("@taj", value)

还会验证访问者设置的值,例如:

my $obj = My::Obj->new();   # should assign default 0444
my $obj = My::Obj->new(perm => '1666'); #as string
my $obj = My::Obj->new(perm => 0555); #as octal

所以,寻找一些东西

$obj->perm('0666');
#etc

e.g。希望将权限存储为数字(文件操作中可用的内容)。

但不知道如何创建has 'perm' => (is => 'rw', isa => Perm, coerce => 1, default => sub { oct('0444') }); 类型,

  • 因错误的值而死亡
  • 从有效字符串强制转换为八进制值
  • 接受有效的八进制值

e.g。尝试了像

这样的东西
Perm

但上面将其验证为subtype 'Perm', as 'Str', #but i want store a number where { $_ =~ /\A[01246]?[0-7]{3}\z/ }; #but i know the validation for strings only 并且我想存储Str值,所以我迷路了。;(

有人可以帮忙吗?

修改

还在与此作斗争。

octal

以上版画:

package Some;
use 5.018;
use warnings;
use namespace::sweep;
use Moose;
use Moose::Util::TypeConstraints;

subtype 'Perm', as 'Int', where { $_ >= 0 and $_ <= 06777 }, message { 'octal perm out of range' };
subtype 'PermStr', as 'Str', where { $_ =~ /\A[01246]?[0-7]{3}\z/ }, message { 'bad string-perm' };
coerce 'Perm', from 'PermStr', via { oct("$_") };

has 'perm' => ( is => 'rw', isa => 'Perm', coerce => 1, default => 0444, );
no Moose::Util::TypeConstraints;

package main;
my($p,$q);
$p = '0333' ; $q = Some->new(perm => $p); printf("dec:%d oct:%o\n", $q->perm, $q->perm);
$p = '0383' ; $q = Some->new(perm => $p); printf("dec:%d oct:%o\n", $q->perm, $q->perm);
$p =   0333 ; $q = Some->new(perm => $p); printf("dec:%d oct:%o\n", $q->perm, $q->perm);
$p = 033333 ; $q = Some->new(perm => $p); printf("dec:%d oct:%o\n", $q->perm, $q->perm);

E.g。 perm以八进制形式输入(并检测超出范围),但是来自字符串

  • 不会检查匹配
  • 并没有进行八进制转换。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

subtype 'Perm',
    as 'Int',
    where { $_ >= 0 and $_ <= 06777 };

subtype 'PermStr',
    as 'Str',
    where { $_ =~ /\A[01246]?[0-7]{3}\z/ };

coerce 'Perm',
  from 'PermStr',
  via { oct($_) };

请勿忘记使用coerce => 1声明您的属性。

注意:我为where提供的Perm条款比您为PermStr提供的条款限制性更小。将其更改为不允许03000-03777和05000-05777是留给读者的练习。