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

wmi*_*ell 5 perl hash

我在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

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);
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)


Log*_*gan 5

根据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)


Eli*_*sky 4

如果键是字符串,只需:

$rec->{"reqHdrs.bla"}
Run Code Online (Sandbox Code Playgroud)

  • ...如果使用单引号 (`'`) 而不是双引号 (`"`) 字符串,性能增益非常小;) (2认同)
  • @Eli:从“perl -MO=Terse”的输出来看,它可以。有一种思想认为,您应该使用单引号,以向*程序员*提供一个提示:插值是不必要的,尽管如果您添加了需要插值的内容并且忘记更改引号,这可能会困扰您。 (2认同)