Регулярное совпадение регулярного выражения с Perl

Вопрос Noob. У меня очень простой perl script, и я хочу, чтобы регулярное выражение соответствовало нескольким частям в строке

my $string = "ohai there. ohai";
my @results = $string =~ /(\w\w\w\w)/;
foreach my $x (@results){
    print "$x\n";
}

Это не работает так, как я хочу, поскольку он возвращает ohai. Я бы хотел, чтобы он соответствовал и распечатывал ohai ther ohai

Как я могу это сделать.

Спасибо

Ответ 1

Будет ли это делать то, что вы хотите?

my $string = "ohai there. ohai";
while ($string =~ m/(\w\w\w\w)/g) {
    print "$1\n";
}

Он возвращает

ohai
ther
ohai

От perlretut:

Модификатор "//g" означает глобальное совпадение и позволяет совпадающий оператор в соответствии с как можно больше раз.

Кроме того, если вы хотите поместить совпадения в массив, вы можете сделать:

my $string = "ohai there. ohai";
my @matches = ($string =~ m/(\w\w\w\w)/g);
foreach my $x (@matches) {
    print "$x\n";
}    

Ответ 2

Или вы могли бы сделать это

my $string = "ohai there. ohai";
my @matches = split(/\s/, $string);
foreach my $x (@matches) {
  print "$x\n";
}   

Функция split в этом случае разбивается на пробелы и печатает

ohai
there.
ohai