我正在审查一个脚本,我遇到了一个我无法弄清楚的块:
if ((@ifAliasVals[1])&&(%{@ifAliasVals[0]})) {
...
}
%{@ifAliasVals[0]}
在做什么?
答案 0 :(得分:4)
if (@ifAliasVals[1] && %{ @ifAliasVals[0] })
是一种糟糕的写作方式
if ($ifAliasVals[1] && %{ $ifAliasVals[0] })
%{ EXPR }
是哈希取消引用。 %{ EXPR }
与%hash
基本相同,但是通过引用而不是名称来访问。
在标量上下文中,如果散列具有任何元素,则%hash
返回true,因此%{ $ifAliasVals[0] }
检查$ifAliasVals[0]
引用的散列是否包含元素。
my $hash1_ref = { };
my $hash2_ref = { a => 1 };
say %{ $hash1_ref } ? 'has elements' : 'empty'; # empty
say %{ $hash2_ref } ? 'has elements' : 'empty'; # has elements
答案 1 :(得分:2)
语法%{ ... }
将大括号之间的表达式视为散列引用,并取消引用它,为您提供整个散列。
语法@ifAliasVals[0]
从数组@ifAliasVals
返回数组切片。在这种情况下,数组切片只有一个元素,因此可以更好地写为$ifAliasVals[0]
。无论如何,它为您提供了数组@ifAliasVals
的第一个元素。
整个表达式%{ @ifAliasVals[0] }
因此将@ifAliasVals
的第一个元素解释为哈希引用,解除引用,产生该哈希的内容。
在上面的if语句的上下文中,如果散列有任何元素,&&
的右边将为true,如果散列为空,则为false。