Я использую Perl.

Вот строка $ match_name:

|1015809840|ref|NG_009004.2|
|1015809841|ref|NG_009005.2|

Я хочу, чтобы результат был:

1015809840
1015809841

Я пытаюсь:

$match_name =~ s/(.*?|.*?)|.*//g;

Удаляет всех персонажей.

0
sara 20 Апр 2016 в 19:43

2 ответа

Лучший ответ
my ($second_field) = $row =~ /^ [^|]* \| ( [^|]* ) \|/x;
my $second_field = ( split(/\|/, $row) )[1];

Однако, вероятно, лучше всего использовать Text :: CSV_XS.

1
ikegami 20 Апр 2016 в 17:00

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

use strict;
use warnings 'all';
use 5.010;

while (<DATA>) {
    my @fields = unpack 'x A10 x A3 x A11';
    say $fields[0];
}

__DATA__
|1015809840|ref|NG_009004.2|
|1015809841|ref|NG_009005.2|

Выход:

1015809840
1015809841

Шаблон unpack x A10 x A3 x A11 означает:

  • x: пропустить символ
  • A10: прочитать 10 символов в первом поле
  • x: пропустить символ
  • A3: прочитать 3 символа во втором поле
  • x: пропустить символ
  • A11: прочитать 11 символов в третьем поле

perlpacktut дает отличное введение в использование pack и unpack с фиксированными данные ширины.

0
ThisSuitIsBlackNot 20 Апр 2016 в 17:13