2010-04-15 46 views
5

我在Perl中的哈希已被倾倒进一些遗留代码项的名称已经从简单地改变REQHDRS到reqHdrs.bla现在如何使用具有字面点的Perl哈希键?

$rec->{reqHdrs.bla} 

我的问题是我似乎无法访问此场从哈希任何想法? 以下是我的错误

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

*'我如何使用具有文字点一个Perl哈希键'* - 标题是有点误导:它不是*字面点*说造成问题,但没有引号*键字面*带点。 – Wolf 2015-11-03 12:38:53

回答

4

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

$rec->{"reqHdrs.bla"} 
+2

...如果使用单引号(''')而不是双引号('“')字符串,则性能增益非常微小;) – 2010-04-15 17:14:31

+0

@Carl:为什么单引号更快? – 2010-04-15 17:18:57

+0

@Eli:单引号不插入 – 2010-04-15 17:22:15

-1

的裸字reqHdrs.bla真的只是一个...代名词,我想,对于一个字符串。我并不完全确定,但我认为您应该可以简单地使用一个字符串,例如'reqHdrs.bla'作为您的密钥,并应该检索您的值确定。

3

括在引号中的键:

$rec->{'reqHdrs.bla'} 
17

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', 
    }; 
+1

Upvote为最全面和有用的答案的很多。 :) – 2010-04-15 17:29:02

5

根据perldoc perldata当使用一个标识符在curlies内,例如当通过一个键访问一个散列值时,该标识符被认为是一个字符串,并被视为这样。行情将被自动假定,但是,任何更复杂的东西都可以被解释。

perldata

事实上,这样 花括号内的识别符被强制为一个字符串,作为 是散列 标内的任何简单的标识符。都不需要引用。我们的 前面的示例$days{'Feb'}可以是 写为$days{Feb}并且报价 将被自动假定。但 下标 中任何更复杂的内容都将被解释为 表达式。这意味着例如 $version{2.0}++相当于 $version{2}++,而不是 $version{'2.0'}++

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

的解决问题的方法:

$rec->{'reqHdrs.bla'} 
+0

我没有看到以前的帖子引用了perldata中的相同片段。 – Logan 2010-04-15 17:54:14