Соответствие шаблону Perl при использовании массивов - PullRequest
7 голосов
/ 13 марта 2012

У меня странная проблема с сопоставлением с шаблоном.

Рассмотрим приведенный ниже код Perl

#!/usr/bin/perl -w

use strict;
my @Array = ("Hello|World","Good|Day");

function();
function();
function();

sub function 
{
  foreach my $pattern (@Array)  
  {
    $pattern =~ /(\w+)\|(\w+)/g;
    print $1."\n";
  }
    print "\n";
}

__END__

Ожидаемый вывод должен быть


Hello
Good

Hello
Good

Hello
Good

Но я получаю

Hello
Good

Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li
ne 28.
Use of uninitialized value $1 in concatenation (.) or string at D:\perlfiles\problem.pl li
ne 28.

Hello
Good

Я заметил, что шаблон альтернативно совпадает.
Может кто-нибудь объяснить мне, в чем проблема с этим кодом.
Чтобы исправить это, яизменил подпрограмму функции на что-то вроде этого:

sub function 
{
    my $string;
    foreach my $pattern (@Array)
    {
        $string .= $pattern."\n";
    }
    while ($string =~ m/(\w+)\|(\w+)/g)
    {
            print $1."\n";
    }
    print "\n";
}

Теперь я получаю вывод, как и ожидалось.

1 Ответ

6 голосов
/ 13 марта 2012

Это глобальный модификатор /g, который работает.Он запоминает позицию последнего совпадения с образцом.Когда он достигает конца строки, он начинается заново.

Удалите модификатор /g, и он будет действовать так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...