不了解%在Perl中做了什么

时间:2013-12-10 03:39:30

标签: perl syntax

我正在审查一个脚本,我遇到了一个我无法弄清楚的块:

if ((@ifAliasVals[1])&&(%{@ifAliasVals[0]}))  {

...

}

%{@ifAliasVals[0]}在做什么?

2 个答案:

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