Я разработчик команды Xamarin в Realm, поэтому я могу рассказать вам немного больше о том, как работает продукт Xamarin.
В Realm есть ядро C ++, которое является общим для всех продуктов. Вот почему мы выпускаем для каждой платформы , а не только для языка - нам нужно включить собственное ядро. Несмотря на то, что мы поддерживаем сборку PCL вашего кода, у нас нет библиотеки PCL как таковой - во время сборки ваш код PCL будет ссылаться на соответствующую библиотеку IOS или Android.
Это означает, что, например, продукт C # обеспечивает LINQ, для запросов и использования объектов C # в качестве средства определения модели данных. Во время сборки генератор кода Fody запускается, чтобы добавить средства определения свойств и геттеры, чтобы ваши объекты C # напрямую взаимодействовали с основными данными на C ++. В отличие от обычных продуктов ORM, нет копий данных из базы данных в буферы, а затем снова в ваши объекты.
Данные в области данных отображаются в памяти, поэтому они переходят непосредственно из вашего кода в хранилище. Мы генерируем методы доступа, которые заменяют автотестеры getters и seters.
Мы используем термин zero-copy , чтобы описать это. Напротив, большинство других систем будут иметь объекты C #, которые имеют поля, поддерживающие их свойства. Эти объекты часто заполняются копированием из буфера SQLite, который был прочитан из хранилища disk . Это два уровня копирования.
Попробуйте это:
@filtered = map {s/ //g; $_} @outdata;
Проблемой является s оператор в жемчуге, изменяет $ _, но на самом деле возвращает количество изменений, которые это внесло. Так, дополнительный $ _ в конце заставляет жемчуг возвращать измененную строку для каждого элемента @outdata.
Обратите внимание, что карта собирается изменить Ваш исходный массив также. Таким образом, Вы могли или сделать:
map {s/ //g} @outdata;
и пропустите @filtered переменную в целом, или если необходимо сохранить оригиналы,
@filtered = @outdata;
map {s/ //g} @filtered;
Хотя в этом случае это могло бы быть более читаемо для использования foreach:
s/ //g foreach @filtered;
Ответ Greg имеет проблему, что это изменит исходный массив, когда $ _ передаются искаженные. Вам нужно:
@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
Для следования точке Tithonium это также добьется цели:
@filtered = map {local $_=$_; s/ //g; $_} @outdata;
"Локальное" гарантирует, что Вы работаете над копией, не оригиналом.
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
Как контрапункт к ответу Greg, Вы могли неправильно использовать grep:
@filtered = grep {s/ //g; 1} @outdata;
Не делайте этого.