سؤال

عندما أكون تشغيل العبارة التالية:

@filtered = map {s/ //g} @outdata;

هو إرجاع قائمة فارغة بدلا من تصفية القائمة التي كنت أتوقع.ما أحاول القيام به هو إزالة كل حدوث   من مجموعة من سلسلة (وهو ملف XML).

ومن الواضح أنا لا أفهم شيئا.يمكن لأحد أن يقول لي الطريقة الصحيحة للقيام بذلك قد يكون السبب في هذا لا يعمل بالنسبة لي ؟

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

المحلول

جرب هذا:

@filtered = map {s/ //g; $_} @outdata;

المشكلة هي s المشغل في بيرل يعدل $_ ولكن في الواقع ترجع عدد من التغييرات التي أجريتها.لذا اضافية $_ في النهاية أسباب بيرل للعودة تعديل سلسلة لكل عنصر من عناصر @outdata.

نصائح أخرى

علما بأن الخريطة هو الذهاب الى تعديل المصدر مجموعة أيضا.لذلك يمكن أن إما:

map {s/ //g} @outdata;

وتخطي @تصفيتها متغير تماما ، أو إذا كنت بحاجة إلى الاحتفاظ النسخ الأصلية ،

@filtered = @outdata;
map {s/ //g} @filtered;

على الرغم من أن, في هذه الحالة, قد يكون أكثر قابلية للقراءة استخدام foreach:

s/ //g foreach @filtered;

جريج إجابة المشكلة أنه سيتم تعديل الأصلي مجموعة باسم $_ هل مرت مستعارة.أنت بحاجة إلى:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;

متابعة Tithonium نقطة ، وهذا أيضا سوف تفعل الخدعة:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

"المحلية" يضمن أنك تعمل على نسخة الأصلية.

في بيرل 5.14 يمكن استخدام /r regex التعديل على جعل غير المدمرة الاستبدال.

@filtered = map {s/ //gr} @outdata;
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;

كنقيض جريج الإجابة, هل يمكن إساءة استخدام البقرى:

@filtered = grep {s/ //g; 1} @outdata;

لا تفعل هذا.

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