我有一个文件,其中包含像
这样的行<tag host="xyz|abc" some info />
<tag host="ijk,cdf" some info />
我通过模式匹配获取主机的信息,我想分割主机的值。出于某种原因,以下代码似乎不适用于逗号,即使它看起来是正确的。
if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/)
{
($val) = ($2);
$val=~tr/!$()//ds;
my @values;
if($val =~ m/((\S+)\|(\S+))*/ )
{
@values=split('\|',$val);
}
else
{
@values=split(',',$val);
}
#Perform some action on Values.
}
任何人都能帮助我吗?提前谢谢。
答案 0 :(得分:2)
一些想法:
use strict
,use warnings
和一些缩进会很好:)
你在哪里写(\s\S)
我认为你熟悉JavaScript并且意味着字符类 [\s\S]
?无需匹配您感兴趣的部分之前和之后的文本
/s
上的tr///
修饰符与/d
更容易收集所有既不是管道也不是逗号的字符子串
这是我写的方式
use strict;
use warnings;
while (my $line = <DATA>) {
if ($line =~ m/host="(\S+)"/) {
(my $href = $1) =~ tr/!$()//d;
my @values = $href =~ /[^,|]+/g;
print "@values\n";
}
}
__DATA__
<tag host="xyz|abc" some info />
<tag host="ijk,cdf" some info />
<强>输出强>
xyz abc
ijk cdf
答案 1 :(得分:0)
代码中不需要if-else
。您可以将条件组合成一个行代码。
更改您的代码:
use strict;
use warnings;
if($line =~ m/(\s\S)*host=\"(\S+)\"(\s\S)*/)
{
($val) = ($2);
$val=~tr/!$()//ds;
my @values;
@values = split (/[,|]/,$val);
#Perform some action on Values.
}