我正在使用哈希表来帮助迭代文件的权限。
如果测试不成功,我想将$permissions{$perm}[0]
标记为0
,但我不确定这是否可行?
my %permissions = (
'w' => { 'write' => '0' unless (-w $file) }, #dies here
'r' => { 'read' => '0' unless (-r $file) },
'x' => { 'execute' => '0' unless (-x $file) },
);
它以syntax error near "'0' unless"
失败。
有没有办法在哈希声明中执行此操作?
答案 0 :(得分:5)
这应该等同于你想要的
my %permissions = (
'w' => { 'write' => -w $file ? 1 : 0 },
);
或更短,
'w' => { 'write' => (-w $file) +0 },
答案 1 :(得分:3)
除非你的哈希值多于你所说的,否则有两个哈希值是毫无意义的,因为它只是意味着你必须写$permissions{r}{read}
,$permissions{w}{write}
等。我建议最好只使用第一级密钥。
此外,您可能会将哈希值用作类似
的布尔值if ( $permissions{x} ) {
# Code that runs $file
}
您也可以只存储文件测试返回的值,而不是将它们转换为1和0。
所以你的哈希变成了
my %permissions = (
w => -w $file,
r => -r $file,
x => -x $file,
)
对于 true ,将使用1
的值,对于 false ,将使用空字符串''
。
或者你可以只分配一个哈希切片
my %permissions;
@permissions{qw/ r w x /} = (-r, -w, -x) for $file;
创建相同的结构,因为如果您不提供参数,文件测试运算符将使用$_
的值。
答案 2 :(得分:2)
不允许使用此类构造,您只能在语句末尾使用除非子句。
您可以使用三元运算符:
my %permissions = (
'w' => { 'write' => (-w $file ? 'some_value' : 0 ) },
'r' => { 'read' => (-r $file ? 'some_value' : 0 ) },
'x' => { 'execute' => (-x $file ? 'some_value' : 0 ) },
)
答案 3 :(得分:0)
这里已经显示了正确的方法,但我想我会写一些关于为什么给出的例子不起作用
以下是示例代码如何有效
my %permissions = (
w => do { 0 unless -w $file},
r => do { 0 unless -r $file},
x => do { 0 unless -x $file});
这是有效的,因为do块包含语句,但它本身就是一个表达式