我正在尝试重用我们内部的库函数,但是由于我的输入中的新变种,事情不正常并且抛出错误。
我意识到问题在于它现在正试图将一个时髦的句子分配为哈希键,例如下面的键列表,正如您所料,它并不喜欢它。有没有办法在对它进行哈希处理之前对其进行编码以防止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]))
答案 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哈希键的另一个合法值。
当我偶然发现它时,我对此提出了一个眉毛,但它完全符合这些答案中已经陈述的规则:任何字符串都被允许为哈希键。
就我而言,它非常有用。