Использование Delete в Perl - PullRequest
0 голосов
/ 28 февраля 2011

Я создаю структуру данных графа, которая по существу содержит массив узлов (и edgeList с дополнительной информацией). У меня также есть хеш, который позволяет мне быстро получить ссылку на определенный узел, дав ему имя. Предположим, теперь я хочу реализовать функцию removeNode () в классе графа, как я могу быстро что-то удалить. Допустим, функция берет имя узла, и я хэширую его непосредственно (и имею ссылку на этот узел). Delete принимает в качестве параметра массивы или хэши, но внутри массива я хочу удалить объект, на который у меня есть ссылка.

Есть идеи?

1 Ответ

1 голос
/ 28 февраля 2011

Мне не совсем ясно, что именно вы пытаетесь сделать.Если вы просто хотите удалить элемент из хеша, delete $hash{$key}; - это все, что вам нужно.

Если вы хотите удалить элемент из массива и не оставить этот индекс неопределенным, тогда вы можете использовать splice @array, $index, 1; который удалит элемент и сдвинет все после него на одну позицию вниз.

Если вы хотите просто удалить элемент из массива, но оставить остальную часть списка в покое, вы можете просто отменить его определение: $array[$index] = undef;

Это то же самое, что делает delete $array[$index], но использование delete в индексе массива не рекомендуется.

Редактировать :

Если вам нужно найти объект в массиве и затем удалить его, лучше всего использовать firstidx из List :: MoreUtils, например,

use List::MoreUtils 'firstidx';

my $obj = get_object_to_delete();
my $index = firstidx { $_ eq $obj } @array;
splice @array, $index, 1;

Предполагается, что объекты преобразуются в нечто подходящее для сравнения на равенство.Если они перегружены, используйте что-то вроде refaddr из Scalar :: Util для непосредственного получения числового ссылочного адреса.

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