كيف يمكنني إرجاع قائمة hashrefs من خريطة في بيرل؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي التعليمة البرمجية التالية في الغالب طيب:

my $results = { data => [
   map {
      my $f = $_->TO_JSON;
      $f->{display_field} = $_->display_field($q);
      $f;
   } $rs->all
]};

وفقط فما استقاموا لكم فاستقيموا بل كانت أشبه ما يلي:

my $results = { data => [
   map {
      %{$_->TO_JSON},
      display_field => $_->display_field($q),
   }, $rs->all
]};

ولكن هذا يعطي خطأ في بناء الجملة. كيف يمكنني أن أفعل ما أريد، أو هي لغتي النسخة الحالية أفضل يحصل؟

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

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

المحلول

وانه يعطي سوى خطأ لغوي لأنك بيرل تعتقد أنك بحاجة إلى حذف الفاصلة بعد map { ... }، لأنه تحليل تلك الخريطة باعتبارها كتلة، وليس تعبيرا. ووضع + أمام إصلاح ذلك. أيضا، لا يمكن أن يكون فاصلة منقوطة في تجزئة مجهول:

my $results = { data => [
   map +{
#      ^----------------- plus sign added
      %{$_->TO_JSON},
      display_field => $_->display_field($q);
#                                           ^---- should be comma or nothing
   }, $rs->all
]};

نصائح أخرى

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

perldoc -f map سوف اقول لكم كل شيء عن هذا. في الأساس، فإنه يقول انك اذا وضعت +{، وبيرل نفهم أن هذا يعني "ليست كتلة التعليمات البرمجية" وتخمين أنه إشارة التجزئة. وربما هذا هو السبب في خطأ في بناء الجملة الخاصة بك. كما اقتراح آخر، فإنه قد عمل ليقول map({ HASH STUFF }, $rs->all) - أراهن المال سوف بيرل لا أعتقد أنها إشارة الشفرة هنا

.

وأنا لم أستطع الحصول عليه للعمل، ولكن عدم وجود $rs أو ->TO_JSON أو متغير اسمه $q لم أستطع الحصول على أي من هذا العمل على أي حال. آمل أن يساعد هذا. إذا لم يكن، بعد أكثر من رمز صغيرة. لا تقلق، نحن لا تعض.

وأيضا، بينما نحن في ذلك، لماذا لا تكتب على هذا النحو:

my $results;
$results->{data} = [ map MAGIC MAP STUFF, $rs->all ];

ويمكن القول قد يكون أكثر قابلية للقراءة، وخاصة إذا كنت تقوم بإضافة الكثير من الاشياء ل$results في كل مرة.

وأنا لست متأكدا تماما أي نوع من هيكل كنت أبحث عنه. وmap في المثال الأول بإرجاع بالفعل قائمة من hashrefs (كل نسخة من $f).

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

وشيء من هذا القبيل:

my $results = { data => [
    map { { %{$_->TO_JSON},
            display_field => $_->display_field($q)
          }
    } $rs->all
]};

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

وبصرف النظر عن أي شيء آخر يحدث، المثال الأول الخاص بك تبدو على ما يرام. الانتقال وحل المشاكل الحقيقية. :)

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