Сведения о вопросе

Faridun

19:06, 23rd August, 2020

Теги

perl   map    

Почему моя карта Perl ничего не возвращает?

Просмотров: 396   Ответов: 7

Когда я выполняю следующий оператор:

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

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

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



  Сведения об ответе

SILA

04:27, 7th August, 2020

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

map {s/ //g} @outdata;

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

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

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

s/ //g foreach @filtered;


  Сведения об ответе

park

04:42, 14th August, 2020

Попробовать это:

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

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


  Сведения об ответе

pumpa

15:50, 29th August, 2020

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

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


  Сведения об ответе

ASER

07:21, 8th August, 2020

Чтобы проследить за точкой зрения титония, это также сделает трюк:

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

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


  Сведения об ответе

darknet

15:38, 8th August, 2020

В perl 5.14 можно использовать модификатор /r regex для выполнения неразрушающей замены .

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


  Сведения об ответе

lesha

09:13, 14th August, 2020

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


  Сведения об ответе

$DOLLAR

14:48, 5th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться