理解哈希键的'foreach'语法

时间:2018-01-05 15:40:39

标签: perl foreach hashmap

我创建了一个简单的Perl哈希

Sample.pl

$skosName = 'foo';
$skosId   = 'abc123';

$skosFile{'type'}{$skosId} = $skosName; 

稍后我尝试使用foreach打印哈希值。

此变体有效

foreach $skosfile1type ( keys %{skosFile} ){

    print ...
}

虽然这个不是

foreach $skosfile1type ( keys %{$skosFile} ) {

    print ...
}

两个foreach语句之间有什么区别?

特别是,在不起作用的陈述中,美元符号$的重要性是什么?

是否与范围有关,或者我是否遗漏了myour个关键字?

2 个答案:

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