هل يمكن لـ Getopt::Long استيعاب أسماء الخيارات المتغيرة؟

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

  •  27-10-2019
  •  | 
  •  

سؤال

أنا أكتب نصًا يمكنه القيام بشيء مثل:

اسم البرنامج النصي --resource1=xxx --resource2=xxx

لكن هذا يمكن أن يصل إلى 50+.هل هناك طريقة لجعل GetOpt يقبل أسماء الخيارات الديناميكية؟

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

المحلول

ماذا عن الإنشاء التلقائي لقائمة الخيارات لـ Getopt :: Long likeالمثال أدناه؟نظرًا لأن قائمة الخيارات ستكون طويلة جدًا على الأرجح ، يسمح استخدام Getopt :: ArgvFile عليك تزويد ملف التكوين بالخيارات بدلاً من تحديدها في سطر الأوامر. Genacodicetagpre

نصائح أخرى

هل يعمل بنفس اسم الخيار معاد?

على سبيل المثال: script-name --resource=xxx --resource=xxx

نعم، لأنني اكتشفت للتو كيفية القيام بذلك بنفسي لأنني أردت قبول وسيطة -# ولا يقبل Getopt::Long التعبير العادي لاسم الخيار.إذن هذا ما فعلته:

use Getopt::Long qw(:config pass_through);

my $ret=GetOptions(
    \%gops,
    'lines|l',  # lines/records to display
    ... cut ...
    '<>' => \&filearg,          # Handle file names also attach current options
);

ثم قمت بتعريف الدالة filearg() :

sub filearg {
    my $arg=shift;

    # First see if it is a number as in -20 as shortcut for -l 20
        if ($arg =~ /^--?(\d)+$/) {
        $gops{'lines'}=$1;
    } elsif (-f "$arg" && -r "$arg") {
        my %ops=%gops;
        $fops{$arg}=\%ops;
        push(@files, $arg);
    } else {
        push(@badargs, $arg);
    }
    return(undef);
}

إذن ما هو مطلوب هو خيار pass_through، والتحقق مما تريده وتعيين تلك الأشياء عند رؤيتها.أعلاه تم تمرير خيارات غير محددة إلى وظيفتي.أستخدم هذا لفحص الملفات ولخيار خاص -# حيث يمثل # عددًا صحيحًا.إذا لم يكن متطابقًا، أقوم بإضافته إلى مصفوفة badargs، لأن القيام بذلك لن يتسبب في فشل GetOptions، لذلك لا بد لي من التحقق من هذه المصفوفة بعد العودة من GetOptions لمعرفة ما إذا كانت هناك أخطاء.يمكنك أيضًا إنهاء الأمر عند خطأ الخيار عن طريق إنهاء وظيفة رد الاتصال بـ die("!FINISH"); مما سيؤدي إلى قيام GetOptions بإنهاء البرنامج النصي.

ما أستخدمه من أجله هو القدرة على الحصول على شيء مثل -20 FILE1 -30 FILE2، لذلك يمكن تجاوز الخيارات للملفات اللاحقة.أرى أنك قادر على القيام بشيء مماثل من خلال التحقق من الجزء الأول من اسم الخيار ثم القيمة.لذلك إذا كانت جميع خياراتك تبدأ بـ --resource ثم ابحث عن شيء مثل هذا في وظيفتك: /^--?(resource\w+)=(.*)$/ ثم قم بإضافتها إلى مجموعة الخيارات.

على أي حال، نأمل أن يساعد هذا.

هناك طريقة أخرى للمحاولة وهي استخدام نوع من ملفات التكوين.يبدو أن هذه قد تكون أسهل طريقة للكتابة والتحليل ، نظرًا لأنك تخطط للحصول على قدر كبير من المعلومات.

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