Perl - 将两个拆分命令合并为一个

时间:2014-04-26 21:33:38

标签: perl

我有一个我正在清理的perl脚本,它工作得非常好,但我想知道是否有人知道将2个拆分组合成一个命令的好方法。

我有一个.csv文件,就像这个小例子:

Move_VALIDATE,020212191ABC01,SNSNT---01CAB101A-1-1-4-20,circuit 402339-1,interface 1/1/0
Move_VALIDATE,030323202ABC01,SNSNT01CAB101A-1-1-4-20,circuit 303559-1,interface 2/2/0

带有两个分割的脚本部分:

foreach my $line (@file_array){
my $CHECK_ID = (split /,/, $line) [2];
my @SPLIT_ID = (split /-/, $CHECK_ID);
my $FINAL_ID = ($CHECK_ID =~ /---/) ? "$SPLIT_ID[0]---$SPLIT_ID[3]" : "$SPLIT_ID[0]";
print "$FINAL_ID\n";
}

输出:

SNSNT---01CAB101A
SNSNT01CAB101A

2 个答案:

答案 0 :(得分:1)

首先,如果你有很多字段的长行,那么你可以限制要求split返回的字段数。在这种情况下,您需要第三个字段,因此您希望将拆分限制为四个字段。

其次,在现场结束时更容易移除您不需要的部分。

#!/usr/bin/env perl

use strict;
use warnings;

while (my $line = <DATA>) {
    (my $id = (split /,/, $line, 4)[2]) =~ s/(?:-[0-9]{1,2})+\z//;
    print "$id\n";
}

__DATA__
Move_VALIDATE,020212191ABC01,SNSNT---01CAB101A-1-1-4-20,circuit 402339-1,interface 1/1/0
Move_VALIDATE,030323202ABC01,SNSNT01CAB101A-1-1-4-20,circuit 303559-1,interface 2/2/0
$ ./klklj.pl
SNSNT---01CAB101A
SNSNT01CAB101A

答案 1 :(得分:0)

你可以使用一个分割用于逗号,并使用单词边界断言用于第二个,例如:

#!/usr/bin/env perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
    printf qq|%s\n|, (split /\b-\b/, (split /,/, $_)[2])[0];
}


__DATA__
Move_VALIDATE,020212191ABC01,SNSNT---01CAB101A-1-1-4-20,circuit 402339-1,interface 1/1/0
Move_VALIDATE,030323202ABC01,SNSNT01CAB101A-1-1-4-20,circuit 303559-1,interface 2/2/0

像以下一样运行:

perl script.pl

产量:

SNSNT---01CAB101A
SNSNT01CAB101A