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

时间:2010-04-15 17:09:48

标签: perl hash

我在Perl中有一个哈希,它已从一些遗留代码中转储,密钥的名称现已从简单的reqHdrs更改为reqHdrs.bla

$rec->{reqHdrs.bla}

我的问题是现在我似乎无法从散列中访问此字段的任何想法? 以下是我的错误

Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use

5 个答案:

答案 0 :(得分:17)

perldoc perldata中所述:

  

...此类curlies中的标识符被强制为字符串,哈希下标中的任何简单标识符也是如此。也不需要引用。我们的   在前面的示例中,$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',
    };

答案 1 :(得分:5)

根据perldoc perldata,当在curlies中使用标识符时,例如当通过密钥访问散列值时,该标识符被假定为字符串并被视为如此。将自动假设报价,但是,可以解释任何更复杂的报价。

来自perldata

  

实际上,这样的标识符   curlies被迫成为一个字符串,如   是散列中的任何简单标识符   标。也不需要引用。我们的   前面的例子,$days{'Feb'}可以   写作$days{Feb}和引号   将自动假设。但   任何更复杂的东西   下标将被解释为   表达。这意味着例如   $version{2.0}++相当于   $version{2}++,不是   $version{'2.0'}++

由于.用于字符串连接,我猜的解释器试图将这两个字符串连接在一起。无论使用引号使其显式更好总是更好,如果你有strict,它可能会抛出“不允许的赤字”错误。

解决问题的方法:

$rec->{'reqHdrs.bla'}

答案 2 :(得分:4)

如果键是一个字符串,只需:

$rec->{"reqHdrs.bla"}

答案 3 :(得分:3)

将密钥括在引号中:

$rec->{'reqHdrs.bla'}

答案 4 :(得分:-1)

裸字reqHdrs.bla实际上只是一个...同义词,我想,对于一个字符串。我不完全确定,但我认为你应该能够简单地使用一个字符串,例如'reqHdrs.bla'作为您的密钥,可以检索您的价值。