سؤال

وبالنظر إلى الملفات التالية:

department=value1
location=valueA
location=valueB
department=value2

وأنا استخدم التالية لتحميل الملف إلى تجزئة بيرل:

use File::Slurp;
use Data::Dumper;
my %hash = map {
   s/#.*//;
   s/^\s+//;
   s/\s+$//;
   m/(.*?)\s*=\s*(.*)/;
} read_file($file);
print Dumper(\%hash);

وكانت النتيجة، ومع ذلك، هو كما يلي:

$VAR1 = {
          'location' => 'valueB',
          'department' => 'value2'
        };

وكيف يمكنني تحميل الملف أعلاه إلى تجزئة، ويقول،

$VAR1 = {
          'location' => 'valueA,valueB',
          'department' => 'value1,value2'
        };

وشكرا.

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

المحلول

وهنا تذهب:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

وهذا يمشي من خلال كل تقسيم خط على علامة '=' وإما يضيف دخول أو إلحاق إلى إدخال موجود في جدول التجزئة.

نصائح أخرى

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

name:       Wally Jones
department: [foo, bar]
location:   [baz, biff]

ملحوظة أيضا أن YAML يسمح لك لنحت أزواج مفتاح / قيمة بحيث يصطف لتسهيل القراءة.

ويتم رمز للتحليل من قبل وحدة نمطية، YAML :: XS كونه أفضل من باقة.

use File::Slurp;
use YAML::XS;
use Data::Dumper;

print Dumper Load scalar read_file(shift);

وبنية البيانات يشبه ذلك:

$VAR1 = {
          'department' => [
                            'foo',
                            'bar'
                          ],
          'location' => [
                          'baz',
                          'biff'
                        ],
          'name' => 'Wally Jones'
        };

ويمكنك إضافة بعض رمز إلى وظيفة الخريطة الخاصة بك للتحقق من وجود دخول التجزئة وإلحاق القيمة الجديدة؟

وأنا لم تفعل بيرل في حين، ولكن عندما فعلت شيئا من هذا القبيل في الماضي، وأنا أقرأ الملف في سطرا سطرا (في حين $ inputLine = )، وتستخدم الانقسام على '=' تحميل تجزئة مع عمليات فحص إضافية لمعرفة ما إذا كان التجزئة بالفعل هذا المفتاح، إلحاق إذا كان الإدخال موجودة بالفعل.

scroll top