هل يمكن لـ Perl's Getopt::Long تحليل الحجج التي لا أحددها مسبقًا؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

أعرف كيفية استخدام Perl's Getopt::Long، لكنني لست متأكدًا من كيفية تكوينه لقبوله أي زوج "--key=value" الذي لم يتم تعريفه بشكل صريح ولصقه في تجزئة.بمعنى آخر، لا أعرف مسبقًا ما هي الخيارات التي قد يريدها المستخدم، لذلك لا توجد طريقة بالنسبة لي لتحديدها جميعًا، ومع ذلك أريد أن أكون قادرًا على تحليلها جميعًا.

اقتراحات؟شكرا في وقت مبكر.

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

المحلول

Getopt::Long وثائق تشير إلى خيار التكوين التي قد تساعد على:

pass_through (default: disabled)
             Options that are unknown, ambiguous or supplied
             with an invalid option value are passed through
             in @ARGV instead of being flagged as errors.
             This makes it possible to write wrapper scripts
             that process only part of the user supplied
             command line arguments, and pass the remaining
             options to some other program.

وعندما يتم تحليل الخيارات العادية، يمكنك استخدام رمز مثل أن <لأ href = "https://stackoverflow.com/questions/529868/using-perls-getoptlong-with-arbitrary-arguments/529914#529914" > المقدمة من runrig لتحليل خيارات مخصصة.

نصائح أخرى

وGetopt :: طويل لا تفعل ذلك. يمكن تحليل الخيارات نفسك ... منها مثلا.

my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
  if ( /^--(\w+)=(\w+)$/ ) {
    $opt{$1} = $2;
    shift @ARGV;
  } elsif ( /^--$/ ) {
    shift @ARGV;
    last;
  }
}

وأو تعديل Getopt :: طويل على التعامل معها (أو تعديل التعليمات البرمجية أعلاه لمعالجة أكثر أنواع الخيارات إذا كنت بحاجة إلى ذلك).

وأنا جزئية قليلا، ولكن لقد استعملت Getopt :: أيا كان في الماضي لتحليل الحجج غير معروفة.

من المحتمل أنه يمكنك استخدام "الخيارات مع قيم التجزئة" ميزة.

على سبيل المثال، أردت السماح للمستخدمين بتعيين مرشحات عشوائية عند التحليل من خلال مجموعة من الكائنات.

GetOptions(my $options = {}, 'foo=s', 'filter=s%')

my $filters = $options->{filter};

ومن ثم نسميها مثل

perl ./script.pl --foo bar --filter baz=qux --filter hail=eris

والذي من شأنه أن يبني شيئًا مثل ..

$options = {
          'filter' => {
                        'hail' => 'eris',
                        'baz' => 'qux'
                      },
          'foo' => 'bar'
        };

وبالطبع سيكون للمرشحات $ القيمة المرتبطة بـ "الفلتر"

حظ سعيد!آمل أن يكون شخص ما قد وجد هذا مفيدًا.

الوثائق :

حجة استدعاء

<اقتباس فقرة>

وثمة خيار خاص 'اسم' <> يمكن استخدامها لتعيين روتين للتعامل مع الحجج غير خيار. عندما يصادف GetOptions() حجة لا تبدو خيارا، وسوف ندعو فورا هذا روتين ويمررها معلمة واحدة: اسم الحجة.

حسنا، في الواقع هو كائن stringifies إلى اسم الحجة.

فمثلا:

    my $width = 80;
    sub process { ... }
    GetOptions ('width=i' => \$width, '<>' => \&process);

عندما يطبق على سطر الأوامر التالية:

    arg1 --width=72 arg2 --width=60 arg3

هذا وسوف ندعو process("arg1") بينما $width 80، process("arg2") بينما $width هو 72، وprocess("arg3") بينما $width 60.

هذه الميزة تتطلب تكوين الخيار بدل ترتيب كذا، انظر القسم "تكوين Getopt :: طويل" .

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

وبوصفها جانبا، وهذا النوع من التعليمات البرمجية يجعلني أكره Getopt المتغيرات:

use Getopt::Long;
&GetOptions(
    'name' => \$value
);

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

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