Массив Perl: сопоставление с образцом, затем переход к другому массиву - PullRequest
2 голосов
/ 06 мая 2019

Perl: я хочу переместить каждый элемент массива, который соответствует шаблону.

Например, у меня ниже массив @ array1 = {кошка 2, собака 3 # двигаться, тигр 4 # двигаться, лев 10}

Теперь я хочу переместить собаку 3, тигра 4 (в соответствии с шаблоном #move) другому массиву скажем @ array2

foreach $array (@array1) {
    if ($array =~ m/(./w*) (./d*)#move/) {
          push @array2, $1.$2;
    }

Но я хочу удалить эти элементы из array1.Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 06 мая 2019

Существует более одного способа сделать это, так что вот еще один, вдохновленный этим ответом : используйте grep, чтобы сохранить нужные элементы. Поскольку Perl поддерживает удаление элементов из массива, который вы перебираете в определенных ситуациях, вам не нужно знать, что это за ситуации :).

use strict; use warnings;
my @array1 = ("cat 2", "dog 3#move", "tiger 4#move", "lion 10");
my @array2;

@array1 = grep {    # We are going to search over @array1 and only keep some elements.
    if (/(.*)#move/) {  # If this is one we want to move...
        push @array2, $1;   # ... save it in array2...
        0;      # ... and do not keep it in array1.
    } else {
        1;      # Otherwise, do keep it in array1.
    }
} @array1;

# Debug output - not required
print "Array 1\n";
print join "\n", @array1;
print "\nArray 2\n";
print join "\n", @array2;
print "\n";

Выход:

Array 1
cat 2
lion 10
Array 2
dog 3
tiger 4
1 голос
/ 06 мая 2019

Это то, что делает функция extract_by из List :: UtilsBy :

use strict;
use warnings;
use List::UtilsBy 'extract_by';
my @array1 = ("cat 2", "dog 3#move", "tiger 4#move", "lion 10");
my @array2 = map { s/#move//r } extract_by { m/#move/ } @array1;
1 голос
/ 06 мая 2019

Вот один из способов:

use feature qw(say);
use strict;
use warnings;
use Data::Printer;

my @array1 = ("cat 2", "dog 3#move", "tiger 4#move", "lion 10");
my @array2;
my @temp;
for my $elem (@array1) {
    if ( $elem =~ m/^(.*)#move/) {
        push @array2, $1;
    }
    else {
        push @temp, $elem;
    }
}
@array1 = @temp;

p \@array1;
p \@array2;

Вывод :

[
    [0] "cat 2",
    [1] "lion 10"
]
[
    [0] "dog 3",
    [1] "tiger 4"
]
0 голосов
/ 07 мая 2019

Возможное решение с использованием List :: Util

#!/usr/bin/env perl
#
use warnings;
use strict;
use List::Util qw(pairs pairgrep pairkeys);


my @array1 = ("cat 2", "dog 3#move", "tiger 4#move", "lion 10");

my $i=0;
my @indexList= map { ($i++, $_) } @array1;                     #build kv pairs

my @removed;
my @filtered=pairgrep { ($b =~ /#move/);} @indexList;          #grep kv pairs
push @removed, splice @array1, $_, 1 for (pairkeys @filtered); #splice and push

print "Modified original: @array1\n";
print "Removed elements: @removed\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...