Perl 在正则表达式匹配上检索数组索引并打印

Perl retrieve index of array on regex match and print

我希望根据逗号(或制表符)分隔文件中的 header 名称提取列。我有一个标量变量匹配许多 header 可能性,我命名为 '$Acct_Name',其中包括。我想读取文件(第 headers 列),将其与我在“$Acct_Name”中的内容进行匹配,并打印匹配的列及其数据等

这是我的代码:

open(FILE, "list_2.txt") or die "Cannot open file: $!";
my $Account_Name = qr/^Acct ID$|^Account No$|^Account$|^ACCOUNT NUMBER$|Account Number|Account.*?Number|^Account$|^Account #$|^Account_ID$|^Account ID$/i;
my $CLIENT = qr/^CLIENT_NAME$|^Account Long Name$|^ACCOUNT NAME$|^Account Name$|^Name$|portfolio.*?description|^Account Description$/i;

while (my $line = <FILE>) {
    chomp $line;
    my @array = split(/,/, $line);
    my %index;
    @index{@array} = (0..$#array);
    my $Account_Name_ = $index{$Account_Name};
    if (my ($matched) = grep $array[$_] =~  /$Account_Name/, 0..$#array) {
        $Account_Name_ = $matched;
        my $CLIENT_ = $index{$CLIENT};
        if (my ($matched) = grep $array[$_] =~  /$CLIENT/, 0..$#array) {
            $CLIENT_ = $matched;
            print $array[$Account_Name_],",",$array[$CLIENT_],"\n";
        }
    }
}

close(FILE);

数据,list_2.txt

账号,order_num,姓名
dj870-1234,12334566,乔希信任 1992

我的结果

账号,姓名

想出来

账号,姓名
dj870-1234,乔什

出于某种原因,我只能打印基于匹配项的列名。我怎样才能抓取数据?

您需要移动您的打印语句来输出您的数据行 - 这些不匹配,因此在原始代码中永远不会到达打印语句!

use warnings;

open(FILE, "list_2.txt") or die "Cannot open file: $!";
my $Account_Name = qr/^Acct ID$|^Account No$|^Account$|^ACCOUNT NUMBER$|Account Number|Account.*?Number|^Account$|^Account #$|^Account_ID$|^Account ID$/i;
my $CLIENT = qr/^CLIENT_NAME$|^Account Long Name$|^ACCOUNT NAME$|^Account Name$|^Name$|portfolio.*?description|^Account Description$/i;

my ($Account_Name_, $CLIENT_);
while (my $line = <FILE>) {
    chomp $line;
    my @array = split(/,/, $line);
    if (my ($matched) = grep $array[$_] =~  /$Account_Name/, 0..$#array) {
        $Account_Name_ = $matched;
        if (my ($matched) = grep $array[$_] =~  /$CLIENT/, 0..$#array) {
            $CLIENT_ = $matched;
        }
    }
    print $array[$Account_Name_],",",$array[$CLIENT_],"\n";
}

close(FILE);