У меня есть хеш в Perl, который был выведен в из некоторого унаследованного кода, от которого теперь изменилось название ключа просто reqHdrs к reqHdrs.bla
$rec->{reqHdrs.bla}
Моя проблема теперь, я, может казаться, не получаю доступ к этому полю от хеша никакие идеи? Следующее является моей ошибкой
Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
Как описано в perldoc perldata :
... Идентификатор внутри таких фигурных скобок должен быть строкой, как и любой простой идентификатор внутри хеш-индекса. Цитировать тоже не нужно. В нашем предыдущем примере,
$ days {'Feb'}
можно записать как$ days {Feb}
, и кавычки будут приняты автоматически. Но все более сложное в нижнем индексе будет интерпретировано как выражение. Это означает, например, что$ версия {2.0} ++
эквивалентна$ версия {2} ++
, а не$ версия {'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',
};
Если ключ является строкой, просто:
$rec->{"reqHdrs.bla"}
Простое слово reqHdrs.bla
на самом деле просто ... синоним Наверное, для струны. Я не совсем уверен, но думаю, вы сможете просто использовать строку, например. 'reqHdrs.bla'
в качестве вашего ключа, и это должно получить ваше значение ОК.
Согласно perldoc perldata
, когда идентификатор используется в фигурных скобках, например при доступе к хеш-значению через ключ этот идентификатор считается строкой и рассматривается как таковая. Котировки будут приняты автоматически, однако все более сложное можно интерпретировать.
Из perldata
Фактически, идентификатор в таких фигурных скобках должен быть строкой, поскольку - это любой простой идентификатор в хеш-индексе . . Цитировать тоже не нужно. В нашем предыдущем примере,
$ days {'Feb'}
можно записать как$ days {Feb}
и кавычки будет принято автоматически. Но все более сложное в нижнем индексе будет интерпретироваться как выражение . Это означает, например, что , что$ version {2.0} ++
эквивалентно$ version {2} ++
, а не {{1 }}$ версия {'2.0'} ++
.
Начиная с .
используется для конкатенации строк, интерпретатор, как я предполагаю, пытается объединить эти две строки вместе. Несмотря на это, всегда лучше использовать кавычки, чтобы сделать это явным, и если у вас есть strict , он, вероятно, выдаст ошибку «bareword not allowed».
Решение вашей проблемы:
$rec->{'reqHdrs.bla'}