LINUX.ORG.RU

Perl. Найти элемент массива и заменить его значение.

 ,


0

3

Всем привет!

Я новичок в перле. Встала задача найти первый найденных элемент в массиве, соответствующий некоторому значению и заменить значение этого элемента.

Для простоты задачи, взьмем массив:

my @my_arr = ("test1", "test2", "test3", "test2", "test5", "test2", "test6");

Нужно найти в массиве @ma_arr первый элемент со значением test2 и заменить его значение на «best2». Як лучше всего на ваш взгдя такое проделать? И если можно, то маленький пример в студию).

Заранее спасибо.


my @a = qw(test1 test2 test3 test2 test5 test2 test6);

for my $i (0 .. $#a) {
	if ($a[$i] eq 'test2') {
		$a[$i] = 'best2';
		last;
	}
}
Deleted
()
#!/usr/bin/env perl
use List::MoreUtils;

my @my_arr = ("test1", "test2", "test3", "test2", "test5", "test2", "test6");
my $search = "test2";

my $index = List::MoreUtils::first_index {$_ eq $search} @my_arr;
$my_arr[$index] = "best2";
print $index . " => " . $my_arr[$index];

// это мой первый кот на пердле

Debasher ★★★★★
()
Ответ на: комментарий от Deleted

Сдеал сам, как у вас. А сейчас посмотрел - вариант от гоствизида очень хорош.

Всем спасибо, помогли.

djnoob
() автор топика
Ответ на: комментарий от djnoob

Стой. Какой объем массива? Еще может быть вариант через hash с индексацией, когда данных немеренно и много повторений. Как-то так: http://ideone.com/51SxEV

gh0stwizard ★★★★★
()
#!/usr/bin/perl

use strict;
use warnings;

use Readonly;

Readonly my $search_text => 'test2';
my $i = 0;

my @my_arr = ('test1', 'test2', 'test3', 'test2', 'test5', 'test2', 'test6');

while ($my_arr[$i] ne $search_text) {
    $i++;
}

$my_arr[$i] = best2;

А теперь по сути и по треду:

1) Не используй двойные кавычки в строках, где тебе НЕ нужна интерполяция.
2) Константы заноси в readonly переменные
3) Регулярные выражения медленнее, чем выполненная задача вручную
4) Не стоит использовать сторонние модули в простых задачах, даже если они есть в стандартной комплектации
5) Всегда пользуйся use strict; use warnings;
6) Не используй /usr/bin/env

reprimand ★★★★★
()
Ответ на: комментарий от Debasher

Ну а теперь превратим тред в олимпиаду: newquestion, реквестую версию на жс

а чего не на си? я бы поучаствовал

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

потому что оверхед

полагаю что учитывая что язык и так perl о производительности речь не идёт

Debasher ★★★★★
()
Ответ на: комментарий от reprimand

use Readonly;

Ничего против. Лишняя сущность, у тех, кто балуется и не следует кодексу «мусор на входе — мусор на выходе». И что-то у дело со словами расходится:

Не стоит использовать сторонние модули в простых задачах, даже если они есть в стандартной комплектации

Это тоже, так к слову. Без обид.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от reprimand

В продакшн коде (модули из CPAN) нынче используется тренд через sub MY_CONST { 42 } или use constant. Те, кто использует константы на массивы, хэши либо не понимают, что делают, либо гики свихнувшиеся на модулях типа Readonly. В крайнем случае, имхо, лучше использовать напрямую use Internals или аналоги. Я может не прав, но не видел в живую ни одного модуля, где используют константы на массивах или хэшах (мне даже самому интересно как и почему, зачем, с радостью почитаю код).

Более того, если говорить о перформансе, то в перле всем плевать на перформанс, до тех пор пока модуль не написан на XS. Pure Perl тормоз by design. Тут даже спорить не о чем. Проблемы не использовать XS-модули это проблемы не осиляторства, либо какие-то искуственные ограничения, либо неверно выбранный инструмент. Пример из вакуума, но ненадуманный, скажем использовать perl на android, вот на кой хер нужен там perl, когда есть Dalvik? А если есть возможность, то сразу писать код на NDK.

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Те, кто использует константы на массивы, хэши

ээ... константы на массивы? что? я не предлагал использовать константные массивы или хеши, только лишь как переменные (константы, прости Г-ди).

Если кратко ответить на твой пост, то я курнул pbp, и на моей работе это одобряют. И пока это давало лишь позитивный результат. Хз как сейчас практикуют перл в мире, мне сравнивать особо не с чем.

reprimand ★★★★★
()
Последнее исправление: reprimand (всего исправлений: 1)
Ответ на: комментарий от Debasher

без регулярок

f = 1

; ["test1", "test2", "test3", "test2", "test4"]
   .map(function(x){if(x == "test2" && f) {f = 0; return "best2"} return x })

newquestion
()
Ответ на: комментарий от newquestion

ревью не прошёл, таск реопен

  • нет гарантии что во входных данных нет строки с ','
  • хардокод: 'test2' тоже должен подаваться из вне

Переписывай!

Debasher ★★★★★
()
Ответ на: комментарий от newquestion

Флаг g убери

Согласен. Ляпнул не подумав.

ivn86
()
Ответ на: Io от newquestion

If afterItem is not found, item is appended to the end of the list.

Тебя нельзя допускать к коду.

Debasher ★★★★★
()
Ответ на: комментарий от Debasher

ГЛОБАЛЬНАЯ ТЕОРИЯ ИДЕАЛЬНОГО КОДА И ДАННЫХ

допускающий: нулевой балабол, ниасиливший программирование

newquestion
()
Ответ на: комментарий от newquestion

поздно, ты завалил проект, он отдан другому исполнителю, и теперь ты должен заплатить штраф в виде пяти годных срачей

Debasher ★★★★★
()
Ответ на: комментарий от Debasher

То есть, даже будучи облеванным, ты все равно продолжаешь? Прям как боевой петушок, так держать.

newquestion
()
Ответ на: комментарий от reprimand

Мой ответ был на то, что да, многие согласны, что use constant имеет недостатки. С другой стороны, если использовать альтернативы, то лучшая альтернатива это sub MY_CONST { 42 }. Минус ее в том, что а) выделяет лишние 500кб памяти; б) на критичном коде это решение тормоз. На оба этих случая забивают и не обращают внимания. Никаких best practice, никаких внесений лишних сущностей. Потому что код на XS единственное верное решение, чтобы разрулить проблемы выше. От того, что перформанс спадет на 20% в случае с sub, тогда когда разница по сравнению с XS в 1000%, это капля в море. Плюсом же такого решения является простота и отсутствие зависимостей. Как практика показывает, вносить XS-код (тот же Internals) можно не во всех окружениях. И да, этот модуль используется предложенным тобой Readonly. Помимо того, этот модуль (Readonly) еще использует tie-интерфейс, который скорей всего даже хуже sub (надо бенчить, без б).

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от reprimand

Что то по этому треду незаметно. Слабоватая у тебя пока велосипедовка. Подожди мальца, может подрастет, тогда и будешь участвовать в олимпиадах, и специальных, и не очень.

newquestion
()
foreach (@my_arr) { s#test3#best2# && last }
arto ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.