Как я могу использовать ключ хеша Perl, который имеет литеральную точку?

У меня есть хеш в Perl, который был выведен в из некоторого унаследованного кода, от которого теперь изменилось название ключа просто reqHdrs к reqHdrs.bla

$rec->{reqHdrs.bla}

Моя проблема теперь, я, может казаться, не получаю доступ к этому полю от хеша никакие идеи? Следующее является моей ошибкой

Download Script Output: Bareword "reqHdrs" not allowed while "strict subs" in use
5
задан brian d foy 16 April 2010 в 04:00
поделиться

5 ответов

Как описано в 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',
    };
17
ответ дан 18 December 2019 в 05:55
поделиться

Если ключ является строкой, просто:

$rec->{"reqHdrs.bla"}
4
ответ дан 18 December 2019 в 05:55
поделиться

Простое слово reqHdrs.bla на самом деле просто ... синоним Наверное, для струны. Я не совсем уверен, но думаю, вы сможете просто использовать строку, например. 'reqHdrs.bla' в качестве вашего ключа, и это должно получить ваше значение ОК.

-1
ответ дан 18 December 2019 в 05:55
поделиться

Заключите ключ в кавычки:

$rec->{'reqHdrs.bla'}
3
ответ дан 18 December 2019 в 05:55
поделиться

Согласно perldoc perldata , когда идентификатор используется в фигурных скобках, например при доступе к хеш-значению через ключ этот идентификатор считается строкой и рассматривается как таковая. Котировки будут приняты автоматически, однако все более сложное можно интерпретировать.

Из perldata

Фактически, идентификатор в таких фигурных скобках должен быть строкой, поскольку - это любой простой идентификатор в хеш-индексе . . Цитировать тоже не нужно. В нашем предыдущем примере, $ days {'Feb'} можно записать как $ days {Feb} и кавычки будет принято автоматически. Но все более сложное в нижнем индексе будет интерпретироваться как выражение . Это означает, например, что , что $ version {2.0} ++ эквивалентно $ version {2} ++ , а не {{1 }} $ версия {'2.0'} ++ .

Начиная с . используется для конкатенации строк, интерпретатор, как я предполагаю, пытается объединить эти две строки вместе. Несмотря на это, всегда лучше использовать кавычки, чтобы сделать это явным, и если у вас есть strict , он, вероятно, выдаст ошибку «bareword not allowed».

Решение вашей проблемы:

$rec->{'reqHdrs.bla'}
5
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: