كيف يمكنني توسيع سلسلة مثل "1..15،16" إلى قائمة الأرقام؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

application --fields 1-6,8

وأنا المطلوبة لعرض الحقول كما طلب من قبل المستخدم على سطر الأوامر.

وفكرت في استبدال '-'. مع '..' حتى أستطيع أن تخزينها في مجموعة منها مثلا

$str = "1..15,16" ;
@arr2 = ( $str ) ;
@arr = ( 1..15,16 ) ;
print "@arr\n" ;
print "@arr2\n" ;

والمشكلة هنا هي أنarr يعمل بشكل جيد (كما يجب) ولكن في @ arr2 لم يتم توسيع السلسلة بأكملها باعتبارها عناصر المصفوفة.

ولقد حاولت استخدام أحرف ولكن لم الحظ.

ويمكن أن يتم ذلك بهذه الطريقة؟

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

المحلول

وإذا كان هذا هو إدخال المستخدم، لا تستخدم وحدة التقييم سلسلة على أنه إذا كان لديك أي مخاوف أمنية على الإطلاق.

:: المدى بدلا من ذلك:

 use Number::Range;

 $str = "1..15,16" ;
 @arr2 = Number::Range->new( $str )->range;
 print for @arr2;

لتجنب الموت على نطاق غير صالح، القيام به:

 eval { @arr2 = Number::Range->new( $str )->range; 1 } or your_error_handling

وهناك أيضا تعيين :: IntSpan ، والذي يستخدم - بدلا من ..:

 use Set::IntSpan;

 $str = "1-15,16";
 @arr2 = Set::IntSpan->new( $str )->elements;

ولكن ذلك يتطلب النطاقات ليكون في النظام وغير متداخلة (كانت مكتوبة للاستخدام على ملفات .newsrc، إذا كان أي شخص يتذكر ما هي هذه). كما يسمح نطاقات لانهائية (حيث تبدأ سلسلة - <م> رقم أو ينتهي <م> رقم -)، الذي طريقة العناصر سوف تشاءم على

نصائح أخرى

وأنت تفكر في @arr2 = eval($str); منذ كنت تتناولين المدخلات وتقييم ذلك، عليك أن تكون حذرا. ربما يجب عليك @arr2 = eval($str) if ($str =~ m/^[0-9.,]+$/)

وP.S. لم أكن أعرف حول حزمة عدد :: المدى، ولكنها ل<لأ href = "http://kobesearch.cpan.org/htdocs/Number-Range/Number/Range.pm.html#new-" يختلط = " noreferrer نوفولو "> رهيبة . عدد :: المدى FTW.

وكان لي نفس المشكلة في التعامل مع مخرجات بت :: :: ناقل to_Enum. I حلها عن طريق القيام:

$range_string =~ s/\b(\d+)-(\d+)\b/expand_range($1,$2)/eg;

وبعد ذلك أيضا في الملف الخاص بي:

sub expand_range
{
    return join(",",($_[0] .. $_[1]));
}

وهكذا "1،3،5-7،9،12-15" يتحول إلى "1،3،5،6،7،9،12،13،14،15".

وحاولت بجد حقا لوضع هذا التوسع في الجزء 2ND من الصورة /// لذا فإنني لن تحتاج أن وظيفة إضافية، ولكن لم أستطع الحصول على عمل. أنا أحب هذا لأنه في حين سيعمل عدد :: المدى، وبهذه الطريقة لا أملك لسحب في وحدة أخرى لشيء ينبغي أن يكون تافهة.

@arr2 = ( eval $str ) ;

والأشغال، ولو كان ذلك بالطبع عليك أن تكون حذرا جدا مع وحدة التقييم ().

هل يمكن استخدام وحدة التقييم:

$str = "1..15,16" ;
@arr2 = ( eval $str ) ;
@arr = ( 1..15,16 ) ;
print "@arr\n" ;
print "@arr2\n" ;

وعلى الرغم من أن إذا كان هذا هو إدخال المستخدم، ربما عليك تريد القيام ببعض المصادقة على سلسلة الإدخال لأول مرة، للتأكد من لديهم أي شيء لا مدخلات المراوغة.

استخدم الانقسام:

@parts = split(/\,/, $fields);

print $parts[0];
1-6
print $parts[1];
8

وأنت لا يمكن أن مجرد وضع سلسلة تحتوي على '' في صفيف، ونتوقع أن تتحول إلى عناصر (إلا إذا كنت تستخدم بعض بيرل السحر الأسود، ولكن نحن لن نذهب إلى ذلك هنا)

ولكن التعبيرات المنتظمة والانقسام وأصدقائك.

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