不理解%在Perl中的作用

不理解%在Perl中的作用,perl,syntax,Perl,Syntax,我正在审阅一个脚本,我遇到了一个无法理解的障碍: if ((@ifAliasVals[1])&&(%{@ifAliasVals[0]})) { ... } %{@ifAliasVals[0]}在做什么 if (@ifAliasVals[1] && %{ @ifAliasVals[0] }) 这是一种糟糕的写作方式 if ($ifAliasVals[1] && %{ $ifAliasVals[0] }) %{EXPR}是散列解引用%{EX

我正在审阅一个脚本,我遇到了一个无法理解的障碍:

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

...

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

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
这是一种糟糕的写作方式

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

语法
%{…}
将大括号之间的表达式视为散列引用,并将其取消引用,从而获得整个散列

语法
@ifAliasVals[0]
从数组
@ifAliasVals
返回一个数组切片。在本例中,数组切片只有一个元素,因此最好将其写成
$ifAliasVals[0]
。在任何情况下,它都会为您提供数组的第一个元素
@ifAliasVals

因此,整个表达式
%{@ifAliasVals[0]}
@ifAliasVals
的第一个元素解释为散列引用,取消对它的引用,生成该散列的内容


在上面的if语句的上下文中,
&&
的右边如果散列有任何元素,则为true;如果散列为空,则为false。

语法
%{…}
将大括号之间的表达式视为散列引用,并取消引用,从而获得整个散列

语法
@ifAliasVals[0]
从数组
@ifAliasVals
返回一个数组切片。在本例中,数组切片只有一个元素,因此最好将其写成
$ifAliasVals[0]
。在任何情况下,它都会为您提供数组的第一个元素
@ifAliasVals

因此,整个表达式
%{@ifAliasVals[0]}
@ifAliasVals
的第一个元素解释为散列引用,取消对它的引用,生成该散列的内容


在上面if语句的上下文中,如果散列有任何元素,
&&
的右边将为true,如果散列为空,右边将为false。

作为旁注,我很惊讶索引不同<代码>如果($ifAliasVals[0]&&%%{$ifAliasVals[0]})会更有意义。(“如果
$ifAliasVals[0]
包含一个散列引用,如果引用的散列包含元素,那么…”)作为旁注,我很惊讶索引是不同的<代码>如果($ifAliasVals[0]&&%%{$ifAliasVals[0]})会更有意义。(“如果
$ifAliasVals[0]
包含散列引用,并且如果引用的散列包含元素,则…”)