كيف يمكنني إنشاء جدول إرسال في Perl مع المفتاح يحتوي على مساحة بيضاء والروتين الفرعي قبول معلمة صفيف؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

هذا هو تفكيري الحالي ، لكنني لا أعرف كيفية إرساله/تنفيذه

my $key;
my @arraydata;

my %commandfunc{
"ab 1", \&func1(\@arraydata),
"ab 2", \&func2(\@arraydata,
"ab 3", \&func3(\@arraydata)
};

foreach $k (keys %commandfunc){
  if($something =~ /$k/){ #if $something match with a key string
        $key= $k;
        #some processing arraydata here;
    }

}
#dispatching??
my $command = $commandfunc{$key}->(\@arraydata);

الرجاء تصحيح الكود الخاص بي .. شكرا جزيلا

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

المحلول

تتم تهيئة التجزئة مع البالية العادية ( ( ) ) ، وليس بين قوسين مجعد (تلك هي للتجزئة المراجع.) وأنت تهيئة تجزئة مع تعيين قائمة. لذلك يجب أن يكون الجزء الأول:

my %commandfunc = ( 
    "ab 1" => \&func1,
    "ab 2" => \&func2,
    "ab 3" => \&func3
);

ال => المشغل أجمل قليلاً من استخدام فاصلة ولديه فائدة إضافية تتمثل في اقتباس Bowwords على الجانب الأيسر ، إذا لزم الأمر.

لست متأكدًا مما تحاول مطابقته في حلقتك (أين تفعل $_ تعال من؟) ولكن يمكنك أن تفعل شيئًا كهذا:

foreach my $k (keys %commandfunc) {
    if( $something =~ /$k/) {
        my $result = $commandfunc{$k}->( \@arraydata );
    }
}

نصائح أخرى

\&func1 هو مرجع فرعي ، ولكن \&func1(\@arraydata) هو إشارة إلى القيمة التي تم إرجاعها بواسطة مكالمة إلى & func1. حاول بدلاً من ذلك فقط: "ab 1" => \&func1, .... إن تمرير @arrydata صحيح في رمز الإرسال الخاص بك.

لاحظ أن /$k/ سوف تجعل metacharacters مثل. أو * لها تأثير خاص في regex ؛ إذا كنت لا تريد ذلك ، افعل /\Q$k/ في حين أن. أو ربما تريد فقط eq $k?

لم تكن واضحًا حقًا @arraydata تم تعريفه في المقدمة أم لا ، وكم مرة سيتم تنفيذ هذا الرمز. ترجمة مباشرة لمحاولتك ستنتج:

my %commandfunc = (
    "ab 1" => sub { func1(@arraydata) },
    "ab 2" => sub { func2(@arraydata) },
    "ab 3" => sub { func3(@arraydata) },
};

if (my ($match) = grep { $_ eq $key } keys %commandfunc)
{
    my $result = &{$commandfunc{$match}};
}

لكن هذا ليس فعالًا للغاية - %commandfunc يتم تعريف التجزئة مع روتين فرعي مجهول الإغلاق, ، عندما نتمكن بدلاً من ذلك فقط تخزين coderefs إلى الغواصات الأصلية بدون حجج ملزمة ، ونمر في صفيف لاحقًا:

my %commandfunc = (
    "ab 1" => \&func1,
    "ab 2" => \&func2,
    "ab 3" => \&func3,
};

ونسميها هكذا:

my $result = $commandfunc{$match}->(@array);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top