كيف يمكنني إنشاء جدول إرسال في Perl مع المفتاح يحتوي على مساحة بيضاء والروتين الفرعي قبول معلمة صفيف؟
-
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);