提取管道分隔记录的第二个字段

时间:2016-04-20 16:43:53

标签: perl

我正在使用perl。

这是$ match_name:

的字符串
|1015809840|ref|NG_009004.2|
|1015809841|ref|NG_009005.2|

我希望输出为:

1015809840
1015809841

我试试:

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

删除所有字符。

2 个答案:

答案 0 :(得分:1)

.bash_login

my ($second_field) = $row =~ /^ [^|]* \| ( [^|]* ) \|/x;

可能最好使用Text::CSV_XS

答案 1 :(得分:0)

看起来你有固定宽度的数据。您当然可以使用正则表达式来处理固定宽度的数据,但我更喜欢packunpack

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详细介绍了如何将packunpack与固定宽度数据结合使用。