2012-02-17 52 views
2

我想一個散列保存爲一個數據庫打包字符串,我得到的包裝件倒不錯,但我有越來越散回在Perl中,如何打包散列並將其解壓縮回原始狀態?

測試哈希

my $hash = { 

    test_string => 'apples,bananas,oranges', 
    test_subhash => { like => 'apples' }, 
    test_subarray => [ red, yellow, orange ] 

} 

我想到一個問題也許我可以使用JSON:XS,如this example將散列轉換爲json字符串,然後打包JSON字符串...

有關此方法的想法?

回答

4

Storable能夠存儲Perl的結構非常精確的。如果你需要記住某些東西是一個弱引用等,你需要存儲。否則,我會避免它。

JSON(JSON::XS)和YAML是不錯的選擇。

  • 如果你存儲的東西使用可存儲一個版本,並嘗試使用較早版本的它來檢索您可以有問題。這意味着訪問數據庫的所有機器必須具有相同版本的Storable。
  • JSON :: XS比Storable更快。
  • 快速YAML模塊可能比Storable更快。
  • JSON不能存儲對象,但YAML和Storable可以。
  • JSON和YAML是人類可讀的(對一些人來說,也是如此)。
  • JSON和YAML很容易在其他語言中解析和生成。

用法:

my $for_the_db = encode_json($hash); 
my $hash = decode_json($from_the_db); 

我不知道你的男人被 「包裝」。由JSON :: XS的encode_json產生的字符串可以按原樣存儲。我推薦一個BLOB

+0

+1:「對於某些人類」! – Zaid 2012-02-18 07:20:01

4

您可能想給Storable模塊一個旋轉。

它可以:

  • 店的哈希值(REF)作爲一個字符串freeze
  • thaw它在檢索時
+0

即使凍結包含UTF-8字符的東西,「freeze」也會返回字節,而不是字符。 – cjm 2012-02-17 21:11:56

+0

@cjm:謝謝你指出......我誤解了文檔。 – Zaid 2012-02-17 21:25:59

3

存在很多不同的方式來將數據結構存儲在標量中,然後將其恢復到原始狀態。各有優點和缺點。

自從您開始使用JSON之後,我會向您展示如何使用它。

use JSON; 
my $hash = { 

    test_string => 'apples,bananas,oranges', 
    test_subhash => { like => 'apples' }, 
    test_subarray => [ red, yellow, orange ] 

} 

my $stored = encode_json($hash); 

my $restored = decode_json($stored); 

如已經提出的那樣,可儲存也是一個好主意。但它可能比較古怪。如果你只是想讓你自己的腳本/系統存儲和恢復數據,那真是太好了,但除此之外,它可能會讓人感到痛苦。即使通過不同的操作系統傳輸數據也會導致問題。建議您使用凍結,對於大多數本地應用程序,這是正確的調用。如果您決定使用Storable在多臺機器上發送數據,請考慮使用nfreeze。

這就是說,有很多編碼方法可以處理「存儲」數據結構。看看YAML或XML。

1

我不太清楚你的意思是「將散列轉換爲JSON字符串,然後打包JSON字符串」。需要進一步「包裝」?或者你的意思是「存儲」?

在數據庫中存儲散列的方法有很多種。

如Zaid建議,您可以使用Storablefreezethaw您的散列。這可能是最快的方法(儘管如果速度很關鍵,您應該使用您使用的數據進行基準測試)。但是,Storable使用不可讀的二進制格式,這意味着您只能使用Perl訪問此字段。

正如您所建議的那樣,您可以將散列存儲爲JSON字符串。 JSON具有相當人性化的優點,並且大多數語言都有JSON庫,因此可以很容易地從Perl以外的其他位置訪問數據庫字段。

您也可以切換到面向文檔的數據庫,如CouchDBMongoDB,但這是一個更大的步驟。

+1

可儲存不是最快的。它存儲了許多別人不知道的信息,而這需要時間。 – ikegami 2012-02-17 21:42:44

相關問題