Ответ 1
Это будет grep()
:
#!/usr/bin/perl
use strict;
use warnings;
my @arr = ('hello 1', 'hello 2', 'hello 3', 'world1', 'hello 4', 'world2');
my @narr = ( );
print "@arr\n";
@narr = grep(!/world/, @arr);
print "@narr\n";
Здесь я пытаюсь отфильтровать только те элементы, у которых нет подстроки world
, и сохранить результаты обратно в тот же массив. Каков правильный способ сделать это в Perl?
$ cat test.pl
use strict;
use warnings;
my @arr = ('hello 1', 'hello 2', 'hello 3', 'world1', 'hello 4', 'world2');
print "@arr\n";
@arr =~ v/world/;
print "@arr\n";
$ perl test.pl
Applying pattern match (m//) to @array will act on scalar(@array) at
test.pl line 7.
Applying pattern match (m//) to @array will act on scalar(@array) at
test.pl line 7.
syntax error at test.pl line 7, near "/;"
Execution of test.pl aborted due to compilation errors.
$
Я хочу передать массив как аргумент подпрограмме.
Я знаю, что один из способов был бы таким, как это.
$ cat test.pl
use strict;
use warnings;
my @arr = ('hello 1', 'hello 2', 'hello 3', 'world1', 'hello 4', 'world2');
my @arrf;
print "@arr\n";
foreach(@arr) {
unless ($_ =~ /world/i) {
push (@arrf, $_);
}
}
print "@arrf\n";
$ perl test.pl
hello 1 hello 2 hello 3 world1 hello 4 world2
hello 1 hello 2 hello 3 hello 4
$
Я хочу знать, есть ли способ сделать это без цикла (используя некоторую простую фильтрацию).
Это будет grep()
:
#!/usr/bin/perl
use strict;
use warnings;
my @arr = ('hello 1', 'hello 2', 'hello 3', 'world1', 'hello 4', 'world2');
my @narr = ( );
print "@arr\n";
@narr = grep(!/world/, @arr);
print "@narr\n";
Используйте grep
:
sub remove_worlds { grep !/world/, @_ }
Например:
@arrf = remove_worlds @arr;
Использование grep
является наиболее естественным для вашей конкретной проблемы, но для полноты вы также можете сделать это с помощью map
:
sub remove_worlds { map /world/ ? () : $_, @_ }
Здесь немного klunky, но map
дает вам крючок, если вы хотите обработать фильтрованные элементы перед их отбрасыванием.
Используйте grep
@no_world_for_tomorrow = grep { !/world/ } @feathers;
Подробнее, perldoc -f grep
.
Вы можете использовать grep
как:
@arrf = grep(!/world/, @arr);
Выражение !/world/
оценивается для каждого элемента массива @arr
и возвращается список элементов, для которых выражение, которое оценивается как истина, возвращается.
Выражение /world/
выполняет поиск слова world
и является истинным. И выражение !/world/
истинно, если строка world
отсутствует.