kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Xetius
Xetius
Вопрос

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

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

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

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

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

5 2008-08-15T09:38:31+00:00 7
 tchrist
tchrist
Редактировал вопрос 3-го августа 2013 в 5:44
Программирование
perl
map
 Tithonium
Tithonium
22-го августа 2008 в 4:51
2008-08-22T04:51:03+00:00
Дополнительно
Источник
Редактировать
#8415746

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

map {s/ //g} @outdata;

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

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

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

s/ //g foreach @filtered;
15
0
Решение / Ответ
Greg Hewgill
Greg Hewgill
15-го августа 2008 в 9:49
2008-08-15T09:49:17+00:00
Дополнительно
Источник
Редактировать
#8415743

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

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

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

10
0
Shlomi Fish
Shlomi Fish
15-го сентября 2008 в 2:18
2008-09-15T14:18:34+00:00
Дополнительно
Источник
Редактировать
#8415748

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

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
brian  d foy
brian d foy
Редактировал ответ 3-го января 2010 в 5:53
9
0
Michael Cramer
Michael Cramer
15-го сентября 2008 в 2:04
2008-09-15T14:04:43+00:00
Дополнительно
Источник
Редактировать
#8415747

Следить за Tithonium's точки, это будет также сделать трюк:

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

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

6
0
 pasja
pasja
18-го мая 2012 в 5:31
2012-05-18T17:31:29+00:00
Дополнительно
Источник
Редактировать
#8415750

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

@filtered = map {s/ //gr} @outdata;
5
0
 ysth
ysth
1-го декабря 2008 в 3:35
2008-12-01T03:35:43+00:00
Дополнительно
Источник
Редактировать
#8415749
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
4
0
 Cebjyre
Cebjyre
17-го августа 2008 в 3:51
2008-08-17T15:51:55+00:00
Дополнительно
Источник
Редактировать
#8415744

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

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

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

3
0
Похожие сообщества 2
Modern::Perl
Modern::Perl
460 пользователей
Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.
Открыть telegram
use Perl or die;
use Perl or die;
299 пользователей
Группа о языке Perl и обо всём что с ним связано.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 5 дней назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией