كيف يمكنني إنشاء وإضافة مجهول التجزئة معروف تجزئة أثناء تنفيذ البرنامج النصي?

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

سؤال

سوف محاولة توضيح هذا مع مثال على ذلك.خذ مثال شائع تجزئة التجزئة:

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

لأغراض بلدي وأود أن تكون قادرة على إضافة يذكر اسمه ، أو مجهول التجزئة إلى %هوه.لن تحتاج (أو تكون قادرة على) تعريف هذه الفرعية التجزئة حتى وقت التشغيل.كيف يمكن إنجاز هذا مع بيرل?

لقد قرأت كل شيء (و لقد قرأت من خلال Perldocs جوجل بالفعل) يبدو أن عرض الأمثلة حيث جميع الفرعية hahes (مثلا ، "فلينستون", "بادئ ذي بدء" و "عائلة سمبسون") يتم تعريف.

ما أقوم به هو محاولة بناء الوالدين التجزئة التي سوف تحتوي على sub-تجزئات مع صفوف من ملف CSV:

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

عدد من "%لينكس" التجزئات التي أريد غير معروفة حتى وقت التشغيل (لأنها تمثل عدد الأسطر في ملف CSV التي يتم قراءتها في وقت التشغيل).

أي أفكار ؟ إذا لم يكن واضحا بالفعل...ما زلت أحاول أن أتغاضى بيرل التجزئة.

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

المحلول

الأولى إنشاء تجزئة من السطر الحالي أنت تحللين

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

أو إنشاء مرجع إلى تجزئة صريح

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

ثم إضافته إلى العام الخاص بك تجزئة ، وتذكر أن المتداخلة بيرل هياكل فقط تحتوي على مراجع إلى الهياكل الأخرى.

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

تحديث المثال المذكور حلقة على مجموعة من البيانات تحليل

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}

نصائح أخرى

لإضافة مجهول التجزئة في وقت التشغيل, تعيين ذلك كما تفعل العادي تجزئة العنصر:

$HoH{key} = { foo => 42 };

أو

$HoH{key} = $hash_ref;

أو

$HoH{key} = \%hash;
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}

في كل مرة تقوم بإنشاء تجزئة جديدة من خط البيانات, سوف تحتاج إلى التفكير في مفتاح فريد تخزين هذه البيانات في أعلى جدول تجزئة.

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

الآن keys(%HoH) سيعود (لم يتم فرزها) قائمة مثل "line1","line2","line3",....
$HoH{"line5"} سيعود إشارة إلى بيانات 5 سطر من الملف الخاص بك.
%{$HoH{"line7"}} هو نوع من القبيح الجملة لكنه يعود hashtable من البيانات الخاصة بك من السطر 7.
$HoH{"line14"}{"cell02"} يمكن أن تستخدم للحصول على قطعة معينة من البيانات.

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