代码之家  ›  专栏  ›  技术社区  ›  James Peter McConnell

了解哈希键的“foreach”语法

  •  1
  • James Peter McConnell  · 技术社区  · 7 年前

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

    样品pl公司

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

    稍后,我尝试使用 foreach .

    此变体有效

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

    而这个没有

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

    这两者有什么区别 foreach公司 声明?

    特别是,美元符号的意义是什么 $ 在声明中,这不起作用?

    是与范围有关,还是我遗漏了 my our 关键词?

    2 回复  |  直到 5 年前
        1
  •  4
  •   hobbs    7 年前

    %{skosfile} 与相同 %skosfile . 它引用具有该名称的哈希变量。通常,这种形式不用于简单的变量名,但它是允许的。

    %{$skosfile} 表示查看标量变量 $skosfile (记住,在perl中, $foo , %foo @foo 是可区分的变量),并且 $skosfile 作为hashref,它返回引用指向的哈希。相当于 %$skosfile ,但实际上,任何返回hashref的表达式都可以出现在 %{...} .

        2
  •  0
  •   ysth    7 年前

    语法 %{ $scalar } 用于告诉Perl $scalar 是哈希引用,您要撤消该引用。这就是为什么你需要美元符号 $ : $skosfile 是您尝试取消引用的变量。

    以同样的方式, @{ $scalar } 用于取消对数组的引用。

    虽然它不适用于复杂的构造,但在简单的情况下,您也可以缩写 %{$scalar} %$scalar @{$scalar} @$scalar .

    对于表达式 keys %{$skosfile} , keys 需要通过解引用获得的哈希 $skosfile ,一个哈希引用。事实上 foreach 哈希循环如下所示:

    foreach my $key ( keys %hash ) {
      # do something with $key
    }
    

    迭代哈希引用时:

    foreach my $key ( keys %{ $hashref } ) {
      # do something with $key
    }