Perl регулярное выражение, совпадающее с несколькими многострочными группами - PullRequest
2 голосов
/ 15 марта 2012

У меня есть куча текста, и я пытаюсь сопоставить группу шаблонов, регулярное выражение, которое я использую, может соответствовать шаблону, но проблема в том, что он соответствует только второй группе, а не первой группе.

open(FILE, "match.txt") || die("Could not open file ");
my $text = do { local $/; <FILE> };

while( $text =~ m/FibreChannel SCSI Interface.*World Wide Port Number\.*(.*?)\n.*Driver\.+(.*?)\n.*Vendor Name\.+(.*?)\n/sgmp )
{
    print "$1\n$2\n$3\n";
}

Печать

0x1b201
lpfc_740
Испытательная корпорация

Приведенный выше код работает, но он отображает только текст из второй группы, а не из первой группы. Что мне здесь не хватает? Есть ли лучший способ сделать это?

Я думал, что это напечатает

0x1a101
lpfc_740
Испытательная корпорация
0x1b201
lpfc_740
Испытательная корпорация

------------------------ match.txt содержит

\==+FibreChannel SCSI Interface : 
        |----Link State.........................................Down
        |----World Wide Port Number.............................0x1a101
        \==+SCSI Interface : 
           |----Driver..........................................lpfc_740
           |----Queue Depth.....................................2038 
           \==+PCI Device : 
              |----Bus..........................................0x06 
              |----Vendor Name..................................Test Corporation
              |----Slot Description.............................

\==+FibreChannel SCSI Interface : 
        |----Link State.........................................Down
        |----World Wide Port Number.............................0x1b201
        \==+SCSI Interface : 
           |----Driver..........................................lpfc_740
           |----Queue Depth.....................................2038 
           \==+PCI Device : 
              |----Bus..........................................0x0a 
              |----Vendor Name..................................Test Corporation
              |----Slot Description.............................          

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Проблема в том, что первый .* жадно сопоставляет столько, сколько может, не мешая совпадению;так что он проглатывает все до второго World Wide Port Number.Вам нужно изменить его на .*?, как будто вы уже используете его в другом месте.(И, аналогично для других случаев .*.)

0 голосов
/ 15 марта 2012

Вот как это должно быть

$text =~ m/FibreChannel SCSI Interface.*?World Wide Port Number\.*([a-z0-9]+).*?Driver\.+(\w+).*?Vendor Name\.+([a-zA-Z ]+).*?\n/sgmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...