我在Perl中的哈希已被倾倒进一些遗留代码项的名称已经从简单地改变REQHDRS到reqHdrs.bla现在如何使用具有字面点的Perl哈希键?
$rec->{reqHdrs.bla}
我的问题是我似乎无法访问此场从哈希任何想法? 以下是我的错误
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
我在Perl中的哈希已被倾倒进一些遗留代码项的名称已经从简单地改变REQHDRS到reqHdrs.bla现在如何使用具有字面点的Perl哈希键?
$rec->{reqHdrs.bla}
我的问题是我似乎无法访问此场从哈希任何想法? 以下是我的错误
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
如果该键是一个字符串,只是:
$rec->{"reqHdrs.bla"}
...如果使用单引号(''')而不是双引号('“')字符串,则性能增益非常微小;) – 2010-04-15 17:14:31
@Carl:为什么单引号更快? – 2010-04-15 17:18:57
@Eli:单引号不插入 – 2010-04-15 17:22:15
的裸字reqHdrs.bla
真的只是一个...代名词,我想,对于一个字符串。我并不完全确定,但我认为您应该可以简单地使用一个字符串,例如'reqHdrs.bla'
作为您的密钥,并应该检索您的值确定。
括在引号中的键:
$rec->{'reqHdrs.bla'}
如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',
};
Upvote为最全面和有用的答案的很多。 :) – 2010-04-15 17:29:02
根据perldoc perldata
当使用一个标识符在curlies内,例如当通过一个键访问一个散列值时,该标识符被认为是一个字符串,并被视为这样。行情将被自动假定,但是,任何更复杂的东西都可以被解释。
事实上,这样 花括号内的识别符被强制为一个字符串,作为 是散列 标内的任何简单的标识符。都不需要引用。我们的 前面的示例
$days{'Feb'}
可以是 写为$days{Feb}
并且报价 将被自动假定。但 下标 中任何更复杂的内容都将被解释为 表达式。这意味着例如$version{2.0}++
相当于$version{2}++
,而不是$version{'2.0'}++
。
由于.
用于字符串连接,我猜想的解释器试图将这两个字符串连接在一起。无论如何,只要用引号使其明确就更好,如果你有strict,它可能会抛出“裸字不允许”的错误。
的解决问题的方法:
$rec->{'reqHdrs.bla'}
我没有看到以前的帖子引用了perldata中的相同片段。 – Logan 2010-04-15 17:54:14
*'我如何使用具有文字点一个Perl哈希键'* - 标题是有点误导:它不是*字面点*说造成问题,但没有引号*键字面*带点。 – Wolf 2015-11-03 12:38:53