Соответствие шаблону Perl при использовании массивов

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

Рассмотрим код 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__

Результат, который я ожидаю, должен быть


Привет
Хорошо

Привет
Хорошо

Привет
Хорошо

Но то, что я получаю, это

Привет
Хорошо

Используйте неинициализированное значение $ 1 в конкатенации (.) Или строку в D: \ perlfiles \ problem.pl li
ne 28.
Используйте неинициализированное значение $ 1 в конкатенации (.) Или строку в D: \ perlfiles \ problem.pl li
ne 28.

Привет
Хорошо

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

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

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

7 голосов | спросил vels 13 MaramTue, 13 Mar 2012 07:59:22 +04002012-03-13T07:59:22+04:0007 2012, 07:59:22

1 ответ


0

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

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

ответил TLP 13 MaramTue, 13 Mar 2012 08:16:41 +04002012-03-13T08:16:41+04:0008 2012, 08:16:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132