0

我有一个文件,其中包含以下行,

<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.
}

谁能帮我这个 ?提前致谢。

4

2 回答 2

2

一些想法:

  • use strictuse warnings并且一些缩进会很好:)

  • 你在哪里写(\s\S)的我想你熟悉 JavaScript 并且是指字符类 [\s\S]?无需匹配您感兴趣的部分之前和之后的文本

  • /s修饰符tr///on与/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
于 2013-04-16T05:31:47.523 回答
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.
}
于 2013-04-16T04:46:33.090 回答