Вы можете объединять операции в цепочку, одновременно уменьшая необходимый синтаксис. Это имеет то преимущество, что подчеркивает важные части программы, одновременно снижая синтаксический шум.
my @test = map m{/^test1 (.*), test2 (.*), test3 (.)/},
grep /test_names/,
split /\n/;
# use $test[0], $test[1], $test[2] here
Если вы пытаетесь отладить проблему, map и grep могут брать блоки, что упрощает вставку кода проверки ошибок:
my @test = map {
if (my @match = m{/^test1 (.*), test2 (.*), test3 (.)/}) {
@match
} else {
die "regex did not match for: $_"
}
} # no comma here
grep /test_names/,
split /\n/;
Вот несколько разных способов присвоения из массива, которые не имеют прямого отношения к вашему вопросу, но, вероятно, полезны:
my ($zero, $one, $two) = @array;
my (undef, $one, $two) = @array;
my (undef, undef, $two) = @array; # better written `my $two = $array[2];`
my ($one, $two) = @array[1, 2]; # note that 'array' is prefixed with a @
my ($one, $two) = @array[1 .. 2]; # indicating that you are requesting a list
# in turn, the [subscript] sees list context
my @slice = @array[$start .. $stop]; # which lets you select ranges
Чтобы распаковать аргументы в подпрограмму:
my ($first, $second, @rest) = @_;
В методе, который принимает name => value
пар:
my ($self, %pairs) = @_;