9

配列または配列への参照から要素を使用grepまたは削除するにはどうすればよいですか?配列への参照から1つ以上の要素を削除するためにmap使用する際に問題が発生しているので、より良い解決策を提供できるかどうかを確認したいと思います。splicegrepmap

@removedElements = grep /test/, @array;
4

3 に答える 3

10

あなたは"array or reference array"それが2つの異なることだったように言っています。これは紛らわしいです。

配列@removedElementsに名前を付けたので、質問しようとしているのは、要素をから削除@arrayして配置する方法だと思います@removedElements

@removedElements = grep /test/, @array;   
@array           = grep ! /test/, @array;

テストを単純に否定すると、どちらかのリストが生成されます。ループを実行することもできます。

my (@removedElements, @rest);
for (@array) {
    if (/test/) {
        push @removedElements, $_;
    } else {
        push @rest, $_;
    }
}

これには、実行されるチェックが少ないという利点があります。

を使用するにはsplice、インデックスを追跡する必要がありますが、この場合、その価値があるかどうかはわかりません。それは確かにあなたのコードを読みやすくすることはありません。同様にmap、通常のループよりもはるかに役立つとは思えません。

于 2012-05-29T00:58:43.517 に答える
2

extract_byの機能も気に入るかもしれませんList::UtilsBy。渡された配列からアイテムを削除する点を除いて、grep に似ています。

use List::UtilsBy qw( extract_by );

# some values in @array

my @removed = extract_by { m/test/ } @array;

# Matching elements will now be removed from @array and appear in @removed.
于 2012-06-04T22:32:47.250 に答える