Perl中@ Array的正则表达式

时间:2011-05-11 12:40:22

标签: perl

实际上我使用一个perl脚本为我的构建准备Readme txt。在我使用的脚本中

foreach $line (<LOG>) 
{   
    if(length(trim($line))>0)
    {
    $line=trim($line);
    $line=~ s/[\r]//gs;
    if(rindex($line,'#')!=-1)
    {
    $icut=substr($line,0,index($line,']'));
    $icut2=substr($icut,index($icut,'#')+1,length($icut));
    }
    push(@issue,$icut2);

它正在提取正确的问题但是当情况出现时

[I#1303350], [I#1270918],[I#1312521] Updated Physical Confirmation Template based on CO

然后它只提取一个问题并非所有问题都是同一行。所以我修改了我的代码,如

foreach $revno(<REV>)
{
    if(length(trim($revno))>0)
    {
        $revno=trim($revno);
        $revno=~ s/[\r]//gs;
        if(rindex($revno,'#')!=-1)
        {
            $revcut=substr($revno,0,rindex($revno,']'));
            print "$revcut\n";
            $revcut1=substr($revcut,index($revcut,'#')+1,length($revcut));
        }
    }
    push(@issue,$revcut1);

现在它获取所有修订版本号但是输出类似于1312588,1303350], [I#1270918],[I#1312521但我想仅删除# [ ] I但不删除{{ 1}}请告诉我如何通过正则表达式解析它。

3 个答案:

答案 0 :(得分:1)

这可以在没有正则表达式的情况下完成:Transliterate: tr///

use warnings;
use strict;

my $s = '1312588,1303350], [I#1270918],[I#1312521';
$s =~ tr/ ][#I//d;
print "$s\n";

__END__

1312588,1303350,1270918,1312521

答案 1 :(得分:1)

你可以这样做:

echo "[I#1303350], [I#1270918],[I#1312521]" | perl -lnwe "print for m/#(\d+)/g"

答案 2 :(得分:0)

这对我有用:

 my @issues = $line_of_data =~ m/#(\d+)/g;

如果你想要逗号,那么这样做要容易得多:

my $with_commas = join( ', ', @issues );

你仍然将个别问题编号作为数据的“原子”。