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

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

$rec->{reqHdrs.bla}

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

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

Ответы [ 5 ]

17 голосов
/ 15 апреля 2010

Как описано в perldoc perldata :

... Идентификатор в таких curly должен быть строкой, как и любой простой идентификатор в хеш-индексе. Не нужно цитировать. наш В предыдущем примере $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',
    };
5 голосов
/ 15 апреля 2010

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

От perldata

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

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

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

$rec->{'reqHdrs.bla'}
4 голосов
/ 15 апреля 2010

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

$rec->{"reqHdrs.bla"}
3 голосов
/ 15 апреля 2010

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

$rec->{'reqHdrs.bla'}
0 голосов
/ 15 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...