我在Perl中有一个哈希,它已从一些遗留代码中转储,密钥的名称现已从简单的reqHdrs更改为reqHdrs.bla
$rec->{reqHdrs.bla}
我的问题是现在我似乎无法从散列中访问此字段的任何想法? 以下是我的错误
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
答案 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'
作为您的密钥,可以检索您的价值。