2011-10-10 112 views
-2

我試圖重用我們在內部使用的庫函數,但是由於我的輸入中有新的變體,所以事情並不正確,並且出現錯誤。Perl哈希鍵的合法值

我意識到問題在於它現在試圖將一個時髦的句子指定爲哈希鍵,例如下面的鍵列表,並且正如您所期望的那樣,它並不喜歡它。有沒有一種方法可以在對它進行哈希處理之前對其進行編碼,以防止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])) 
+9

任何字符串都是Perl中的合法哈希鍵,包括所發佈內容的所有字符串和子字符串。此外,幾乎任何標量值都可以轉換爲字符串並用作散列鍵,包括對列表,數組和大多數類實例的引用。所以不,我不一定會期望你使用哈希的函數不喜歡它。那麼你試圖避免的具體錯誤和噱頭是什麼?這些輸入是什麼給你帶來麻煩? – mob

+3

@mob:恩說。無可否認,使用字符串化引用作爲散列鍵通常不是非常有用,但有一個_can_可以做到。實際上,你的評論中的「幾乎」是不需要的:如果要求將標量_any_標量轉換爲字符串,則perl _will_將其轉換爲字符串,即使它可能會在執行時發出咳嗽和劈啪聲併發出警告。 (好吧,我想可以使一個超載的標量的字符串轉換例程「死亡」,但這只是簡單的愚蠢。) –

+0

也許你應該顯示一些代碼和錯誤。 – TLP

回答

7

任何字符串都是允許的。任何不是字符串的東西都會先被串起來。

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"; 
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,即corserced到一個字符串。

不幸的是,你沒有發佈任何代碼,所以我們真的不能說你的錯誤是什麼。也許你需要在散列鍵周圍加上引號。或者,也許還有另一個問題。

0

空字符串「」是Perl哈希鍵的另一個合法值。

剛纔我偶然發現它時,我對此提出了一個疑問,但它與這些答案中已經提到的規則完全一致:任何字符串都允許爲散列鍵。

在我的情況下,它非常有用。