Когда я запускаю следующую инструкцию:
@filtered = map {s/ //g} @outdata;
он возвращает пустой список вместо отфильтрованного списка, который я ожидал. Я пытаюсь удалить все вхождения из массива строк (который является файлом XML).
Очевидно, я чего-то не понимаю. Может ли кто-нибудь сказать мне, как это сделать правильно, и почему это не работает для меня как есть?





Попробуй это:
@filtered = map {s/ //g; $_} @outdata;
Проблема в том, что оператор s в perl изменяет $ _, но фактически возвращает количество сделанных изменений. Таким образом, дополнительный $ _ в конце заставляет perl возвращать измененную строку для каждого элемента @outdata.
Я не чувствую себя достаточно злым, чтобы голосовать против, но это плохая идея. stackoverflow.com/questions/12103/… - гораздо лучший ответ.
С Неразрушающая подстановка в Perl 5.14 вы можете сделать это как @filtered = map { s/ //gr } @outdata, не затрагивая @outdata.
В качестве контрапункта к ответу Грега вы можете неправильно использовать grep:
@filtered = grep {s/ //g; 1} @outdata;
Не делай этого.
Обратите внимание, что карта также изменит ваш исходный массив. Итак, вы можете сделать:
map {s/ //g} @outdata;
и полностью пропустите переменную @filtered или, если вам нужно сохранить оригиналы,
@filtered = @outdata;
map {s/ //g} @filtered;
Хотя в этом случае было бы удобнее использовать foreach:
s/ //g foreach @filtered;
map в пустом контексте обычно считается плохой формой и ничего не говорит по сравнению с for @filtered { ... }.
Чтобы развить точку зрения Титониума, это также поможет:
@filtered = map {local $_=$_; s/ //g; $_} @outdata;
«Локальный» гарантирует, что вы работаете с копией, а не с оригиналом.
У ответа Грега есть проблема, заключающаяся в том, что он изменит исходный массив, поскольку $ _ передаются с псевдонимом. Тебе нужно:
@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
В Perl 5.14 вы могли использовать модификатор регулярного выражения /р для сделать неразрушающую замену.
@filtered = map {s/ //gr} @outdata;
Это связано с stackoverflow.com/questions/1458454/…, и у него такой же ответ.