代码之家  ›  专栏  ›  技术社区  ›  wmitchell

如何使用具有文字点的Perl哈希键?

  •  5
  • wmitchell  · 技术社区  · 15 年前

    我在Perl中有一个散列,它已经从一些遗留代码中转储到密钥的名称现在已经从简单的reqHdrs改为需求bla

    $rec->{reqHdrs.bla}
    

    我的问题是现在我似乎无法从哈希访问此字段有什么想法? 以下是我的错误

    Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
    
    5 回复  |  直到 15 年前
        1
  •  17
  •   Sinan Ünür    15 年前

    如中所述 perldoc perldata

    …这种卷曲中的标识符被强制为字符串,哈希下标中的任何简单标识符也是如此。也不需要引用。我们的 前面的例子, $days{'Feb'} 可以写成 $days{Feb} 将被解释为一个表达式。例如,这意味着 $version{2.0}++ 相当于 $version{2}++ $version{'2.0'}++ .

    通常,如果您有一个哈希键,其中一个字符位于 [A-Za-z0-9_]

    use strict; use warnings;
    use Data::Dumper;
    my $x = 1;
    my %hash = (
        bare_string => 'hi there',
        "not a bare string" => 'yup',
    );
    $hash{'$x'} = 'foo';
    $hash{"$x"} = 'bar';
    print Dumper(\%hash);
    

    印刷品:

    $VAR1 = {
          'bare_string' => 'hi there',
          'not a bare string' => 'yup',
          '$x' => 'foo'
          '1' => 'bar',
        };
    
        2
  •  5
  •   Sinan Ünür    15 年前

    根据 perldoc perldata 例如,当通过这样的值访问时,假定在这样的值中的标识符是被卷曲的。引号将自动假定,但是,任何更复杂的可以解释。

    perldata

    事实上,在这种 卷发被迫成为一根弦,就像 下标。也不需要引用。我们的 前面的例子, $days{'Feb'} 可以是 $days{Feb} 还有引语 将自动假定。但是 有更复杂的吗 下标将被解释为 表情。例如,这意味着 那个 $version{2.0}++ 相当于 $version{2}++ ,而不是 $version{'2.0'}++ .

    自从 . 用于字符串连接,我猜解释器正在尝试将这两个字符串连接在一起。不管怎样,用引号来表达总是更好的,如果你有 strict

    问题的解决方案:

    $rec->{'reqHdrs.bla'}
    
        3
  •  4
  •   Eli Bendersky    15 年前

    如果键是字符串,只需:

    $rec->{"reqHdrs.bla"}
    
        4
  •  3
  •   codaddict    15 年前

    将密钥括在引号中:

    $rec->{'reqHdrs.bla'}
    
        5
  •  -1
  •   Carl Smotricz    15 年前

    reqHdrs.bla 真的只是。。。我猜,是字符串的同义词。我不完全确定,但我认为你应该能够简单地使用字符串。 'reqHdrs.bla' 作为您的键,应该可以检索您的值。