Как сохранить совпадающие части регулярного выражения в Perl? - PullRequest
0 голосов
/ 16 сентября 2009

Я хочу отсортировать все API в следующем текстовом файле:

DLL Name: msvcrt.dll
...
DLL Name: msvcrt.dll
...
DLL Name: KERNEL32.dll
...
DLL Name: WSOCK32.DLL

Я думал о чем-то вроде

$infostring = lc($infostring);
while ($infostring =~ /dll name:/g)
{
 print "found dll\n";
}

Единственная проблема в том, как получить действительные имена DLL или хотя бы положение найденной строки?

Ответы [ 2 ]

9 голосов
/ 16 сентября 2009

Вы должны расширить свое регулярное выражение, чтобы захватить имя DLL:

$infostring = lc($infostring);
while ($infostring =~ /dll name: (\S+\.dll)/g) {
  print "found dll: $1\n";
}

\S+\.dll будет соответствовать одному или нескольким непробельным символам, за которыми следует «.dll», а скобки будут собирать соответствующий текст и сохранять его в переменной $1. (Если бы у вас было несколько наборов круглых скобок, вторая перешла бы в $2, третья в $3 и т. Д.)

Редактировать: Похоже, что спецификация ввода была изменена путем редактирования вопроса, когда я писал свой ответ ... Выше было бы для одной строки ввода, содержащей все имена DLL. В новом формате, каждый из которых находится на отдельной строке, вместо этого вы хотите использовать:

while (my $infostring = <$input_filehandle>) {
  $infostring = lc($infostring);
  print "found dll: $1\n" if $infostring =~ /dll name: (\S+\.dll)/;
}

Нет необходимости связываться с /g в регулярном выражении или циклически повторять совпадения, если в одной строке не будет нескольких совпадений.

1 голос
/ 16 сентября 2009
while ($infostring =~ /DLL Name: (.*)/g)
{
    print "found dll: $1\n";
}

Пожалуйста, прочитайте справочную страницу perlre . Вам нужно использовать группу захвата (обозначенную круглыми скобками), чтобы захватить имя DLL. Затем вы можете ссылаться на снимки позже, используя $1, $2, ..., $n

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