我在Perl中有一个哈希,它已从一些遗留代码中转储出来,密钥的名称现在已从简单的reqHdrs更改为reqHdrs.bla
$rec->{reqHdrs.bla}
Run Code Online (Sandbox Code Playgroud)
我的问题是现在我似乎无法从哈希任何想法访问这个字段?以下是我的错误
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
Run Code Online (Sandbox Code Playgroud)
Eth*_*her 17
...这些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);
Run Code Online (Sandbox Code Playgroud)
打印:
$VAR1 = {
'bare_string' => 'hi there',
'not a bare string' => 'yup',
'$x' => 'foo'
'1' => 'bar',
};
Run Code Online (Sandbox Code Playgroud)
根据perldoc perldata
当在curlies中使用标识符时,例如当通过密钥访问散列值时,该标识符被假定为字符串并且被如此处理.将自动假设报价,但是,可以解释任何更复杂的报价.
来自perldata
事实上,这些curlies中的标识符被强制为字符串,哈希下标中的任何简单标识符也是如此.也不需要引用.我们之前的例子
$days{'Feb'}
可以写成,$days{Feb}
报价将自动生成.但是下标中更复杂的东西将被解释为表达式.这意味着例如$version{2.0}++
相当于$version{2}++
,而不是$version{'2.0'}++
.
由于.
用于字符串连接,我猜测的解释器试图将这两个字符串连接在一起.无论使用引号使其明确,总是更好,如果你有严格的,它可能会抛出"不允许的赤字"错误.
解决问题的方法:
$rec->{'reqHdrs.bla'}
Run Code Online (Sandbox Code Playgroud)
如果键是字符串,只需:
$rec->{"reqHdrs.bla"}
Run Code Online (Sandbox Code Playgroud)