Perl Split功能,带逗号

时间:2013-04-16 04:06:50

标签: perl split comma

我有一个文件,其中包含像

这样的行
<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.
}

任何人都能帮助我吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

一些想法:

  • use strictuse 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.
}