Perl:使用正则表达式搜索元素的索引

时间:2014-12-25 15:35:15

标签: regex perl

我有一个包含多个用\t分隔的列的文件,我希望通过使用正则表达式来指定列标题的名称来获取某些列的位置(索引)。 这是我的代码,但我无法使用正则表达式进行搜索:

#!"C:\xampp\perl\bin\perl.exe"
my %dic;
my %index;
while(<>) {
    my @array2 = split(/\t/, $_);
    @index{@array2} = (0..$#array2);

    my $column13= $index{"name13"};// Here I want to search  using regex
    my $column17= $index{"name17"};// Here I want to search  using regex
    my $column21= $index{"name21"};// Here I want to search  using regex
    my $column34= $index{"name32"};// Here I want to search  using regex
    my $column43= $index{"name43"};// Here I want to search  using regex

    print $array2[$column13]$.",".$array2[$column17].",".$array2[$column21].
          ",".$array2[$column34].",".$array2[$column43]."\n"; 
}

例如$columns13的值应为12(位置12)和:

 $column17 = 16
 $column21 = 20
 $column34 = 33
 $column43 = 42

我的输入是一个文件,其中包含多个以\t分隔的列:

name1   name2   name3...    name85
1   2   3       4   ....     765
6   5   9       67  ....      8768
87  787 767     7687 ......   8768

我的输出应该只包含已搜索的列:

name13  name17  name21...   name43
    876 76  87      4  .... 87687
   787  987 9       67  ...  87686
    53  765 767     7687 .... 8686

1 个答案:

答案 0 :(得分:1)

你的规范相当邋,,但我认为这会像你要求的那样做。它将输入中的第一个非空行作为标题行,并在@indices中创建相应索引的列表。每个后续的相应列将打印到STDOUT。

use strict;
use warnings;

my @selection = qw(
    name1
    name3
    name85
);

my @indices;

while (<>) {
  next unless /\S/;
  chomp;
  my @fields = split /\t/;

  unless (@indices) {
    @indices = grep {
      my $i = $_;
      grep { $fields[$i] =~ /$_/ } @selection;
    } 0 .. $#fields;
  }

  print join("\t", @fields[@indices]), "\n";
}