تخزين البيانات المستمر بيرل باستخدام البيانات :: dumper

StackOverflow https://stackoverflow.com/questions/2521142

سؤال

لقد كنت أحاول اكتشاف هذا الأمر لفترة طويلة الليلة. لقد غوغل حتى الموت ولم يتم إنجاز أي من الأمثلة أو اختراقي للأمثلة. يبدو أن هذا يجب أن يكون سهلاً للغاية ولكن لا يمكنني الحصول عليه. هنا هو الرمز:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my $complex_variable = {};
my $MEMORY = "$ENV{HOME}/data/memory-file";

$complex_variable->{ 'key' } = 'value';
$complex_variable->{ 'key1' } = 'value1';
$complex_variable->{ 'key2' } = 'value2';
$complex_variable->{ 'key3' } = 'value3';

print Dumper($complex_variable)."TEST001\n";

open M, ">$MEMORY" or die;
print M Data::Dumper->Dump([$complex_variable], ['$complex_variable']);
close M;

$complex_variable = {};
print Dumper($complex_variable)."TEST002\n";

# Then later to restore the value, it's simply:
do $MEMORY;
#eval $MEMORY;

print Dumper($complex_variable)."TEST003\n";   

وهنا مخرجاتي:

$VAR1 = {
         'key2' => 'value2',
         'key1' => 'value1',
         'key3' => 'value3',
         'key' => 'value'
       };
TEST001
$VAR1 = {};
TEST002
$VAR1 = {};
TEST003    

يقول كل ما قرأته أن إخراج Test003 يجب أن يبدو مطابقًا لإخراج Test001 وهو ما أحاول تحقيقه بالضبط.

ماذا أفتقد هنا؟ هل يجب أن أكون "أفعل" بشكل مختلف أم يجب أن أكون "eval" بدلاً من ذلك ، وإذا كان الأمر كذلك ، فكيف؟

شكرا على اي مساعدة...

هل كانت مفيدة؟

المحلول

لدينا جميع تلك الأمسيات! محاولة:

$complex_variable = do $MEMORY || die "Bad data";

نصائح أخرى

أولاً ، أوصي باستخدام stint.pm بدلاً من البيانات :: dumper. يحتوي Stratent على طرق تجميد وذوبان الجليد والتي يمكن أن تحافظ على مجموعة البيانات في شكل ثنائي دون ترجمتها إلى & مرة أخرى من النص.

ثانياً ، لم أجرب هذا ، لكن لا يبدو لي أنك تقوم بتخزين الهاشرف عندما "تفعل ذاكرة $" تم التعليق على التقييم. محاولة:

$complex_variable = eval $MEMORY;
print Dumper($complex_variable)."TEST003\n";

أنا أميل إلى الإعجاب DBM :: عميق لهذا. ومع ذلك ، لدي فصل كامل عن "الثبات الخفيف" في إتقان بيرل يتحدث عن كل شيء أقل من خادم قاعدة البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top