正则表达式模式 - 使用Perl单独忽略制表符和grep单词

时间:2017-07-14 02:23:11

标签: regex perl

输入文件:(全部按标签分隔)

abc   S12GG    HLPC
        WT4E    dfs.com   512
        SDA     djkf.com    1
        SWEW       abc.com    1
        SEFAW    dfsga.com    1
zyx   S12YT    TYSX
        wureyu    dfs.com   23
        ASWE     djkf.com    10
        werse       abc.com    16
        SDSDFS   dfsga.com    19

我正在创建一个哈希表,第一行作为一个键,而在第二行,只是第一个单词作为键。以下是代码:

sub readFile {
    my ($fileName, $hash) = @_;
    my $lines=0;
    my $key;
    my $buffer;

    open (INPUT, $fileName);
    while($buffer=<INPUT>) {
        $lines++;
        if ($buffer=~/^(.*)\t(.*)\t(.*)$/) {
            $key=trim($1).";".trim($2).";".trim($3).";";
            $buffer=<INPUT>;
            $lines++;
        }
        $buffer=~/\t(.+)\t(.+)\t(.+)/;
        my $item=trim($1);
        my $group=trim($2);
        my $colinfo=trim($3);
        $hash->{$key}{$item}=["$group","$colinfo"];
    }
    close (INPUT);

    return $lines;
}

但是这个匹配if条件中的两行:

if ($buffer=~/^(.*)\t(.*)\t(.*)$/)

这两者都匹配

abc   S12GG    HLPC
        WT4E    dfs.com   512

if条件只能匹配第一行吗?我真的被困在这上面并且长时间不知所措。

https://regex101.com/r/v6JuDb/1/

我试着用它来帮忙。但找不到任何解决方案。帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:3)

我这样做的方式:

myinterface

或者如果密钥格式确实重要,

chomp($line);
if (!/^\t/) {
    $key = $line;
    next;
}

my (undef, $item, $group, $colinfo) = split(/\t/, $line);
$hash->{$key}{$item} = [ $group, $colinfo ];

答案 1 :(得分:1)

使用(.*)而不是([^\t]+),因此它在TAB分隔符中不匹配,并且必须匹配至少一个非TAB字符。