Perl извлекает совпадения из списка - PullRequest
0 голосов
/ 05 октября 2011

Я довольно плохо знаком с Perl, но не с языками сценариев.У меня есть файл, и я пытаюсь извлечь только одну часть каждой строки, которая соответствует регулярному выражению.Например, учитывая файл:

FLAG(123)
FLAG(456)
Not a flag
FLAG(789)

Я хотел бы извлечь список [123, 456, 789]

Регулярное выражение, очевидно, /^FLAG\((\w+)/.У меня вопрос, каков простой способ извлечь эти данные в Perl?

Очевидно, что нет ничего сложного в настройке цикла и выполнении множества =~ совпадений, но я довольно много слышал о Perlкраткость и то, как у него есть оператор для всего, поэтому мне интересно, есть ли простой, простой способ сделать это.

Кроме того, можете ли вы указать мне хороший Perl справочник, где я могу найти интересные способыделать что-то подобное, когда появится такая возможность?В Интернете есть много ресурсов Perl, но 90% из них слишком просты, а остальные 10%, похоже, теряют сигнал в шуме.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Предполагая, что у вас есть все данные в одной строке:

my @matches = $data =~ /^FLAG\((\w+)/mg;

Модификатор /g означает совпадение столько раз, сколько возможно, /m делает совпадение ^ после любой новой строки (не только в начале строки), а совпадение в контексте списка возвращает все записи для всех этих матчей.

Если вы читаете данные построчно, вам нужно именно решение Platinum Azure.

2 голосов
/ 05 октября 2011

Вот как бы я это сделал ... Вы узнали что-то новое и / или полезное?

my $file_name = "somefile.txt";
open my $fh, '<', $file_name or die "Could not open file $file_name: $!";

my @list;
while (<$fh>)
{
    push @list, $1 if /^FLAG\((\w+)/;
}

На что стоит обратить внимание:

  1. В whileусловие цикла (и ТОЛЬКО в состоянии цикла while), чтение из файлового дескриптора установит значение $_ и проверит, что файл был прочитан автоматически.
  2. Оператор можно изменить, добавив if, unless, for, foreach, while или until до конца.Затем он работает как условный или цикл для этого одного оператора.
  3. Вы, вероятно, знаете, что группы захвата регулярных выражений хранятся в $1, $2 и т. Д., Но вы, возможно, не знали, что оператор будетработать, даже если оператор имеет суффикс if.if вычисляется первым, поэтому push @list, $1 if /some_regex/ имеет смысл и сначала выполнит сопоставление, присваивая $1 до того, как это потребуется в операторе push.
1 голос
/ 05 октября 2011

map ваш друг здесь.

use strict;
use warnings;
use File::Slurp;

my @matches = map { /^FLAG\((\w+)/ } read_file('file.txt');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...