连接冒号 (Perl) 之后的行

  • 本文关键字:之后 Perl 连接 perl
  • 更新时间 :
  • 英文 :


>我有这样几行:

alpha: beta
beta: alpha, beta
omega: beta, gamma, alpha
gamma: 
alpha
beta
gamma
epsilon: alpha

我想连接行只包含一个单词,后跟冒号,行不包含冒号:

alpha: beta
beta: alpha, beta
omega: beta, gamma, alpha
gamma: alpha, beta, gamma
epsilon: alpha

这应该与RCs代码相同,但更短一点:

my @lines;
while(<FILE>) {
    chomp;
    if(m/^w+:s(w+(,s)?)*$/) {
            push @lines, $_;
    } else {
            $lines[$#lines] .= ", " unless($lines[$#lines] =~ m/^w+:s?$/);
            $lines[$#lines] .= $_;
    }
}
print join "n", @lines;

这是一个快速而肮脏的版本:

#!/usr/bin/perl
use strict;
use warnings;
my $prevLine = "";
my @others;
for(<DATA>) {
    chomp;
    if (/:s*$/) { # lines ends with : and potential space after
        $prevLine = $_;
    } elsif (!/:/) { # line doesn't contain ':'
        push(@others, $_);
    } elsif ($prevLine eq "") { # this is a "x: y, z" line, nothing in buffer
        print $_ . "n";
    } else { # this is a "x: y, z" line, with a previous line in buffer
        print $prevLine . join(", ", @others) . "n" . $_ . "n";
    }
}
__DATA__
alpha: beta
beta: alpha, beta
omega: beta, gamma, alpha
gamma: 
alpha
beta
gamma
epsilon: alpha

输出:

alpha: beta
beta: alpha, beta
omega: beta, gamma, alpha
gamma: alpha, beta, gamma
epsilon: alpha

如果输入作为脚本的参数在文件中提供,并且稍短一些,这也有效:

$/=$.;$_=<>;s/s?n/, /g;s/, (w+:),?/n$1/g;s/, $/n/;print

它的可读性不是很好,但它适用于 strictwarnings .

输出:

alpha: beta
beta: alpha, beta
omega: beta, gamma, alpha
gamma: alpha, beta, gamma
epsilon: alpha

它可能会进一步缩短。 -ape#!perl -ap将是一个好的开始。

最新更新