Perl哈希键的合法值

时间:2011-10-10 22:32:39

标签: perl hash

我正在尝试重用我们内部的库函数,但是由于我的输入中的新变种,事情不正常并且抛出错误。

我意识到问题在于它现在正试图将一个时髦的句子分配为哈希键,例如下面的键列表,正如您所料,它并不喜欢它。有没有办法在对它进行哈希处理之前对其进行编码以防止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 个答案:

答案 0 :(得分:7)

允许任何字符串。任何不是字符串的东西都会先被字母化。

答案 1 :(得分:2)

正如其他人所说,对哈希密钥的允许范围没有限制。如果您使用引用,它将变为字符串。

但是,有时您需要在哈希键周围需要引号时不需要引号和时间。如果您有空格或非字母数字字符,则需要在哈希键周围添加引号。有趣的是,如果仅使用数字字符,则可以使用句点。否则,您不能使用句号而不使用引号包围句点:

$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'
    };

所以,数组引用是 stringified ,也就是说,它是一个字符串。

不幸的是,你没有发布任何代码,所以我们真的不能说你的错误是什么。也许您需要在哈希键周围加上引号。或者,也许还有另一个问题。

答案 2 :(得分:1)

将其另存为文件并运行它:

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";

答案 3 :(得分:1)

空字符串“”是Perl哈希键的另一个合法值。

当我偶然发现它时,我对此提出了一个眉毛,但它完全符合这些答案中已经陈述的规则:任何字符串都被允许为哈希键。

就我而言,它非常有用。