输入文件:(全部按标签分隔)
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/
我试着用它来帮忙。但找不到任何解决方案。帮助将不胜感激。感谢。
答案 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字符。