Почему моя карта Perl ничего не возвращает? - PullRequest
5 голосов
/ 15 августа 2008

Когда я запускаю следующую инструкцию:

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

он возвращает пустой список вместо отфильтрованного списка, который я ожидал. Я пытаюсь удалить каждое вхождение   из массива строк (который является файлом XML).

Очевидно, я чего-то не понимаю. Может кто-нибудь сказать мне правильный способ сделать это, и почему это не работает для меня, как есть?

Ответы [ 7 ]

15 голосов
/ 22 августа 2008

Обратите внимание, что карта также изменит ваш исходный массив. Так что вы можете сделать:

map {s/ //g} @outdata;

и пропустите переменную @filtered вообще или, если вам нужно сохранить оригиналы,

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

Хотя в этом случае может быть более удобочитаемым использовать foreach:

s/ //g foreach @filtered;
10 голосов
/ 15 августа 2008

Попробуйте это:

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

Проблема в том, что оператор s в perl модифицирует $ _, но на самом деле возвращает количество изменений, которые он сделал. Таким образом, дополнительные $ _ в конце заставляют perl возвращать измененную строку для каждого элемента @ outdata.

9 голосов
/ 15 сентября 2008

Ответ Грега состоит в том, что он изменит исходный массив, так как $ _ передаются с псевдонимом. Вам нужно:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
6 голосов
/ 15 сентября 2008

Чтобы отследить точку Титония, это также поможет:

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

«Местный» гарантирует, что вы работаете с копией, а не с оригиналом.

5 голосов
/ 18 мая 2012

В Perl 5.14 вы можете использовать модификатор регулярного выражения / r , чтобы сделать неразрушающую замену .

@filtered = map {s/ //gr} @outdata;
4 голосов
/ 01 декабря 2008
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
3 голосов
/ 17 августа 2008

В качестве контрапункта к ответу Грега, вы можете неправильно использовать grep:

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

Не делай этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...