Допустимые значения для хеш-ключа Perl - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь повторно использовать библиотечную функцию, имеющуюся у нас дома, но из-за новых вариантов ввода мои данные работают неправильно и выдают ошибки.

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

Document: Multiple Attribute Equals (#root3 #form input[type=hidden], #root3 #form input[type=radio])
Document: Attribute selector using UTF8 (#root3 span[lang=中文])
Document: Attribute Ends With (#root3 a[href $= 'org/'])
Document: Attribute Contains (#root3 a[href *= 'google'])
Document: Select options via [selected] (#root3 #select1 option[selected])
Document: Select options via [selected] (#root3 #select2 option[selected])
Document: Select options via [selected] (#root3 #select3 option[selected])
Document: Grouped Form Elements (#root3 input[name='foo[bar]'])
Document: :not() Existing attribute (#root3 #form select:not([multiple]))
Document: :not() Equals attribute (#root3 #form select:not([name=select1]))

Ответы [ 4 ]

7 голосов
/ 11 октября 2011

Разрешается любая строка. Все, что не является строкой, будет сначала заучено.

2 голосов
/ 11 октября 2011

Как уже говорили другие, нет никаких ограничений на то, что разрешено использовать в качестве хеш-ключа. Если вы используете ссылку, она будет превращена в строку.

Однако бывают случаи, когда вам не нужны кавычки, и время, когда вам нужны кавычки вокруг вашего хеш-ключа. Если у вас есть пробелы или не алфавитно-цифровые символы, вам нужны кавычки вокруг вашего хеш-ключа. Интересно, что вы можете использовать точки, если вы используете только числовые символы. В противном случае вы не можете использовать точки, не заключая ключ в кавычки:

$hash{23.23.23}  = "Legal Hash Key";
$hash{foo.bar}   = "Invalid Hash Key";
$hash{"foo.bar"} = "Legal Hash Key because of quotes";

И, чтобы увидеть, что произойдет, если вы используете ссылку в качестве ключа:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;

my %hash;
my $ref = [qw(this is an array reference)];
$hash{$ref} = "foobar";  #Using Array Reference as Key

say "\nDUMP: " . Dumper \%hash;

Производит:

DUMP: $VAR1 = {
      'ARRAY(0x7f8c80803ed0)' => 'foobar'
    };

Итак, ссылка на массив была строковой , то есть привязана к строке.

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

1 голос
/ 07 ноября 2014

Пустая строка, "", является другим допустимым значением для хеш-ключа Perl.

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

И в моем случае это довольно полезно.

1 голос
/ 11 октября 2011

Сохраните это как файл и запустите:

use strict;
use warnings;
use Data::Dumper;
my %hash;
open( my $fh, '<', $0 ) or die 'Could not open myself!';
$hash{ do { local $/ = <$fh>; } } = 1;
print Dumper( \%hash ), "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...