Perl除非在哈希声明中声明 - 是否可能?

时间:2014-08-30 09:49:49

标签: perl hashtable file-permissions

我正在使用哈希表来帮助迭代文件的权限。

如果测试不成功,我想将$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"失败。

有没有办法在哈希声明中执行此操作?

4 个答案:

答案 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)

这里已经显示了正确的方法,但我想我会写一些关于为什么给出的例子不起作用

  1. 不需要时嵌套哈希
  2. 除非在列表中使用表达式,否则使用语法错误,在这种情况下为哈希引用构造函数。它只适用于正常陈述
  3. 以下是示例代码如何有效

    my %permissions = (
        w     => do { 0 unless -w $file},
        r     => do { 0 unless -r $file},
        x     => do { 0 unless -x $file});
    

    这是有效的,因为do块包含语句,但它本身就是一个表达式