我有这段代码,我正试图解决这个问题,我甚至不知道它的语法是否正确(我想这是练习的一部分!)
%{$records}
花括号表示什么?我见过相同的情况但使用@
运算符代替$
,如果这有所不同。
谢谢你们!
答案 0 :(得分:12)
“Using References” section of the perlref documentation解释。
2. 在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用BLOCK替换标识符,返回正确类型的引用。换句话说,前面的例子可以这样写:
$bar = ${$scalarref}; push(@{$arrayref}, $filename); ${$arrayref}[0] = "January"; ${$hashref}{"KEY"} = "VALUE"; &{$coderef}(1,2,3); $globref->print("output\n"); # iff IO::Handle is loaded
在您的情况下,$records
必须是对哈希的引用(因为最外面的%
),{$records}
是一个返回引用的块,%{$records}
给出原始哈希。
花括号围绕真正的块。实际上,您可以用
替换上面的代码%{ if ($records) { $records } else { $default_records } }
但正如文档前面所指出的那样,即使你问题中较短的版本也可以简化。
1。在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用包含正确引用的简单标量变量替换标识符类型:
$bar = $$scalarref; push(@$arrayref, $filename); $$arrayref[0] = "January"; $$hashref{"KEY"} = "VALUE"; &$coderef(1,2,3); print $globref "output\n";
因为$records
是一个简单的标量,%$records
是底层哈希值。
如果$records
是对数组的引用,则取消引用它的语法为@$records
或@{$records}
。
答案 1 :(得分:7)
与许多Unix shell一样,Perl允许使用大括号来分隔变量标识符,因此my ${scalar}
与my $scalar
相同。这很有用,例如,当将变量的值插入字符串时,"$scalartext"
将查找具有标识符scalartext
的变量,而目标是$scalar.'text'
。除此之外,您可以编写"${scalar}text"
来获得正确的结果。
Perl将接受裸变量标识符或返回对大括号内变量的引用的表达式,因此%{$hashref}
与%$hashref
相同。请注意,字符串是不可接受的,因为它被视为符号引用,这是strict 'refs'
下的错误,因此此处${'scalar'}
是错误的。
在您的情况下,%{$records}
与%$records
相同,有些人更喜欢它,因为它会解除引用。它表示哈希引用$records
引用的哈希值。
答案 2 :(得分:5)
这是你取消引用参考的方式。
像往常一样%
或@
说明你想要什么类型的数据(“哈希”或“数组”)。
接下来是块 {}
,它将引用返回到适当的数据类型。
所以:%{$records}
采用一个包含对哈希引用的标量($records
),然后给你一个哈希值。