我创建了一个简单的Perl哈希
$skosName = 'foo';
$skosId = 'abc123';
$skosFile{'type'}{$skosId} = $skosName;
稍后我尝试使用foreach
打印哈希值。
此变体有效
foreach $skosfile1type ( keys %{skosFile} ){
print ...
}
虽然这个不是
foreach $skosfile1type ( keys %{$skosFile} ) {
print ...
}
两个foreach
语句之间有什么区别?
特别是,在不起作用的陈述中,美元符号$
的重要性是什么?
是否与范围有关,或者我是否遗漏了my
或our
个关键字?
答案 0 :(得分:4)
var lineData = d3.range(0, spend, 100)
.map(x => [ x, alpha * (1 - 2.71828 * (-beta * x))] );
与%{skosfile}
相同。它指的是具有该名称的哈希变量。通常该表单不用于简单的变量名称,但它是允许的。
%skosfile
表示查看标量变量%{$skosfile}
(请记住,在perl中,$skosfile
,$foo
和%foo
是不同的变量),并且,期望@foo
成为hashref,它返回引用指向的哈希值。它等同于$skosfile
,但实际上任何返回hashref的表达式都可以出现在%$skosfile
内。
答案 1 :(得分:0)
语法%{ $scalar }
用于告诉Perl $scalar
的类型是散列引用,并且您想要撤消引用。这就是您需要美元符号$
的原因:$skosfile
是您尝试取消引用的变量。
以同样的方式,@{ $scalar }
用于取消引用数组。
虽然它不适用于复杂的构造,但在简单的情况下,您也可以将%{$scalar}
缩写为%$scalar
,将@{$scalar}
缩写为@$scalar
。
对于表达式keys %{$skosfile}
,keys
需要通过解除引用$skosfile
获得的哈希值,哈希引用。事实上,哈希的典型foreach
循环如下所示:
foreach my $key ( keys %hash ) {
# do something with $key
}
当您迭代哈希ref:
时foreach my $key ( keys %{ $hashref } ) {
# do something with $key
}