регулярное выражение в perl сценарии - PullRequest
0 голосов
/ 08 марта 2020

У меня есть файл с множеством строк в следующем формате

 00000000000 00000000 0 MMM_WR  0            000004            00000abc
 00000000000 00000000 0 MMM_WR  0            000008            0000000c
...

Я хочу извлечь последние 2 слова в переменные в моем скрипте perl и распечатать их

Я пытался

$line =~ m/^.+  MMM_WR  0\s+(\w+)\s+(\w+)/;

 print $1;
 print $2;

но $ 1 и $ 2 всегда неинициализированы

любой совет? пожалуйста

Ответы [ 4 ]

4 голосов
/ 08 марта 2020

У вас есть два пробела перед MMM_WR, где вы должны иметь один.

$line =~ m/^.+ MMM_WR  0\s+(\w+)\s+(\w+)/;

Такого рода вещи безопаснее делать с split. Разделите его на пустое пространство и возьмите нужные поля.

my @fields = split(/\s+/, $line);

Однако это похоже на формат фиксированной ширины, который лучше обрабатывать с помощью unpack. Подробнее об этом см. perlpacktut .

3 голосов
/ 08 марта 2020
$line =~ m/^.+  MMM_WR  0\s+(\w+)\s+(\w+)/;

Это регулярное выражение ожидает два пробела перед MMM_WR

 00000000000 00000000 0 MMM_WR  0            000004            00000abc

Эта строка предоставляет только один пробел перед MMM_WR. Таким образом, ваше регулярное выражение (которое ожидает twp-пространства) не может совпадать. Если вы исправите регулярное выражение, чтобы ожидать только один пробел, он работает.

3 голосов
/ 08 марта 2020

Кажется, в ваших данных только один пробел перед MMM_WR, но регулярное выражение содержит два.

0 голосов
/ 09 марта 2020

Вы можете разбить строку на массив и напечатать два последних элемента

use strict;
use warnings;
use feature 'say';

while(<DATA>) {
    my @data = (split ' ')[5,6];
    say join ' ', @data;
}

__DATA__
 00000000000 00000000 0 MMM_WR  0            000004            00000abc
 00000000000 00000000 0 MMM_WR  0            000008            0000000c

Выход

000004 00000abc
000008 0000000c

Другой вариант с соответствием регулярному выражению

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
    my @data;
    @data = $_ =~ /MMM_WR\s+\d\s+(\d{6})\s+(.+)/;
    say join ' ', @data;
}

__DATA__
 00000000000 00000000 0 MMM_WR  0            000004            00000abc
 00000000000 00000000 0 MMM_WR  0            000008            0000000c

Выход

000004 00000abc
000008 0000000c

Интересующие данные могут быть извлечены с помощью распаковки

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
    my @data = (unpack("A45A6A12A8",$_))[1,3];
    say join ' ', @data;
}

__DATA__
 00000000000 00000000 0 MMM_WR  0            000004            00000abc
 00000000000 00000000 0 MMM_WR  0            000008            0000000c

Вывод

000004 00000abc
000008 0000000c

Изменение с использованием 'substr'

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
    my @data;
    $data[0] = substr $_, 45, 6;
    $data[1] = substr $_, 63, 8;
    say join ' ', @data;
}

__DATA__
 00000000000 00000000 0 MMM_WR  0            000004            00000abc
 00000000000 00000000 0 MMM_WR  0            000008            0000000c

Вывод

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