围绕变量的卷曲括号

时间:2013-02-16 14:54:14

标签: perl syntax

我有这段代码,我正试图解决这个问题,我甚至不知道它的语法是否正确(我想这是练习的一部分!)

%{$records}

花括号表示什么?我见过相同的情况但使用@运算符代替$,如果这有所不同。

谢谢你们!

3 个答案:

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

这是你取消引用参考的方式。

perldoc perlref

像往常一样%@说明你想要什么类型的数据(“哈希”或“数组”)。

接下来是 {},它将引用返回到适当的数据类型。

所以:%{$records}采用一个包含对哈希引用的标量($records),然后给你一个哈希值。