2011-11-25 22 views
0

我有这样的台词:后加入冒号(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 
+0

如果第一行不以冒号结尾,会发生什么?如果前两行不以冒号结尾? –

回答

1

这应该做一样的RC代码,但稍微有点短:

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; 
1

这里的一个快速和肮脏的版本:

#!/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 
1

这如果输入一个文件作为参数传递给剧本提供的,是一个也适用短一点:

$/=$.;$_=<>;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将是一个好的开始。