使用连续元素以单行打印

时间:2013-04-30 19:43:41

标签: perl

所以我有一个像这样的数组:

W,X,Y,Z
-7,6,101,15
-7,6,101,16
-7,6,101,17
-7,6,101,78
-7,6,101,79
-7,6,101,84
-7,6,101,92
-7,9,615,49
-7,9,615,50
-7,10,759,38
-7,10,759,39

现在,我想在W = X = Y时打印一行,Z是连续数字。

预期产出:

W,X,Y,Z
-7,6,101,15-16-17
-7,6,101,78-79
-7,6,101,84
-7,6,101,92
-7,9,615,49-50
-7,10,759,38-39

如何在Perl上实现此功能?

谢谢, 领域

这是我的剧本:

while ( $output_line = <FILE_C> ) {                                                                          
    chomp $output_line;                                                                                      
    my ( $W, $X, $Y, $C, $D, $E, $F, $Z ) = ( split /\s/, $output_line );                                    
    if ( $Y == $Block_previous ) {                                                                           
        print("Yes\t$Block_previous\t$Y\t$Z\n");                                                             
        push( @Z_array, $Z );                                                                                
        push( @Y_array, $Y );                                                                                
        next;                                                                                                
    }                                                                                                        
    else {                                                                                                   
        push( @Z_array_nonblkmatch, $Z );                                                                    
    }                                                                                                        
    foreach $Z_printer (@Z_array) {                                                                          
        print("$Y_array[0]\t$Z_printer\n");                                                                  

        if ( ( $Z_delta == 1 ) || ( $Z_delta == -1 ) ) {                                                     
            push( @Z_adj, $Z_printer, $Z_printer_prev );                                                     

            #~ print ("pair: $Z_printer_prev-$Z_printer\n");                                                 
        }                                                                                                    
        else {                                                                                               
            #~ print ("$Z_printer\n");                                                                       
        }                                                                                                    
        $Z_printer_prev = $Z_printer;                                                                        
    }                                                                                                        
    @Z_adj               = ();                                                                               
    @Z_array             = ();                                                                               
    @Y_array             = ();                                                                               
    @Z_array_nonblkmatch = ();                                                                               
    $Block_previous      = $Y;                                                                               

    #~ <STDIN>;                                                                                              
}                                                                                                            
close(FILE_C);     

谢谢,raina77ow!但是,这就是输出的样子: -7,6,101,15-16-17-79

-7,6,101,16-17-79

-7,6,101,17-79

-7,6,101,78-79

-7,6,101,79-50

-7,6,101,84-50

-7,6,101,92

-7,6,615,49-50-39

-7,6,615,50

1 个答案:

答案 0 :(得分:0)

一种可能的方法(ideone demo):

use warnings;
use strict;

my $prev;
while (<DATA>) {
  chomp;
  next unless /\S/;
  my @numbers = split /,/;
  if (defined $prev && $numbers[3] == $prev + 1) {
    print '-' . ++$prev;
    next;
  }
  print "\n" if defined $prev;
  print join ',', @numbers;
  $prev = $numbers[3];
}

__DATA__
-7,6,101,15
-7,6,101,16
-7,6,101,17
-7,6,101,78
-7,6,101,79
-7,6,101,84
-7,6,101,92
-7,9,615,49
-7,9,615,50
-7,10,759,38
-7,10,759,39

我选择不将这些数据收集到中间数组中,因为问题很简单:将其打印分组。关键是存储最后一个(Z)列的值,然后根据它检查每个新行:如果匹配,则只打印递增的值(即print '-' . ++$prev行的值),如果不是,你结束这一行(除了第一种情况以外的所有情况)并用这一行的数字开始一个新的。